锁定老帖子 主题:方法签名,泛型滥用?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-05-27
总结就是为了“偷懒”,这里我支持泛型,灵活点肯定是风险要多点,
|
|
返回顶楼 | |
发表时间:2009-05-27
最后修改:2009-05-27
抛出异常的爱 写道 jianfeng008cn 写道 还是不明白,抛异常是为了发现问题啊,而且这种类型转换的问题不可能是开发的时候正常使用的时候不正常吧,代码写了放大象就大象啊,不会部署的时候变成放驴子吧?
好吧....如果你这么认为 那就这样吧. 把put方法的签名改成一个就是string不好么? memorycache 没怎么用过 有个公司内开发的... 驴子是真的有 泛型引入,在我看来还是为了编译期检查,帮助coder们及早发现可能的隐患。 这里说到底,本质的问题是要不要相信程序员,你能保证存入是大象,并且清楚知道自己想要得到也是大象,那就没问题。但是代码一复杂,或者脑袋不清楚,希望取出个驴子来也是有可能,异常说的隐患是肯定存在的,不过至少还有个ClassCastException,但是失去了编译期警告的优点。 |
|
返回顶楼 | |
发表时间:2009-05-27
dennis_zane 写道 抛出异常的爱 写道 jianfeng008cn 写道 还是不明白,抛异常是为了发现问题啊,而且这种类型转换的问题不可能是开发的时候正常使用的时候不正常吧,代码写了放大象就大象啊,不会部署的时候变成放驴子吧?
好吧....如果你这么认为 那就这样吧. 把put方法的签名改成一个就是string不好么? memorycache 没怎么用过 有个公司内开发的... 驴子是真的有 泛型引入,我在看来还是为了编译期检查,帮助coder们及早发现可能的隐患。 这里说到底,本质的问题是要不要相信程序员,你能保证存入是大象,并且清楚知道自己想要得到也是大象,那就问题。但是代码一复杂,或者脑袋不清楚,希望取出个驴子来也是有可能,异常说的隐患是肯定存在的,不过至少还有个ClassCastException,但是失去了编译期警告的优点。 那就是api设计的问题了 ,和泛型关系就不大了,比方说你可以让Object作为参数,也可以放string作为参数。 同等条件下相比object,泛型不是更爽! |
|
返回顶楼 | |
发表时间:2009-05-27
最后修改:2009-05-27
jianfeng008cn 写道 那就是api设计的问题了 ,和泛型关系就不大了,比方说你可以让Object作为参数,也可以放string作为参数。 同等条件下相比object,泛型不是更爽! http://www.iteye.com/topic/393930 引用 *正如大师(公司里的一大牛)说的,首先要明确这个“神”: 一是应用要在cache失效的时候能正常工作(至少功能正常,不能挂掉,最多性能稍差), 二是cache不要存在单点,或者说单点的失败不会导致整个应用失败。 大师的观点非常精炼,完全可以作为cache使用的指导方针列出来,没什么好评论的。 |
|
返回顶楼 | |
发表时间:2009-05-27
......
不仅仅是针对cache设计或者使用的讨论吧?程序员非要取驴子,问题就在程序员身上啊。 无论啥玩意都要正确使用,“存大象取大象”这样的规则不复杂,没必要为了万无一失,让代码去承担这个责任吧,损失太大。 引用 泛型引入,我在看来还是为了编译期检查,帮助coder们及早发现可能的隐患。 泛型让代码清爽了很多啊,不是说类似c++的template嘛,不仅仅是编译期检查这么个好处吧。 这个问题有点类似“使用泛型的注意点”这种话题了。 |
|
返回顶楼 | |
发表时间:2009-05-28
java的泛型连c++的template的子集都算不上
|
|
返回顶楼 | |
发表时间:2009-05-28
有泛型帮你检查类型不是挺好吗 虽然没c++的泛型好用
|
|
返回顶楼 | |
发表时间:2009-05-28
对象何必为难对象呢??给个名字就不是对象啦.本质是一样的.没什么多大的意义.
|
|
返回顶楼 | |
发表时间:2009-05-28
visualcatsharp 写道 java的泛型连c++的template的子集都算不上
java泛型支持这样的: <T extends A & B & C> c++ 98的template不支持(最新的不知道) 所以不是子集也不是超集 |
|
返回顶楼 | |
发表时间:2009-05-28
最后修改:2009-05-28
dennis_zane 写道 泛型引入,在我看来还是为了编译期检查,帮助coder们及早发现可能的隐患。
这里说到底,本质的问题是要不要相信程序员,你能保证存入是大象,并且清楚知道自己想要得到也是大象,那就没问题。但是代码一复杂,或者脑袋不清楚,希望取出个驴子来也是有可能,异常说的隐患是肯定存在的,不过至少还有个ClassCastException,但是失去了编译期警告的优点。 不仅在方法上泛型,还要在类上泛型,例如: public class Cache<K, V> { public void put(K key, V value) { ... } public V get(K key) { ... } // 或者 public V get(Object key) } 使用方式比如: Cache<String, Elephant> cache1 = new Cache<String, Elephant>() // 或其他方式获得实例 Elephant elephant1 = ... cache1.put("大象甲", elephant1); // 没有编译期错误 Elephant elephant1get = cache1.get("大象甲"); // 没有编译期错误 assertEquals(elephant1, elephant1get); // 如果写 cache1.put("驴", (Donkey)donkey1); 会报编译期错误 Cache<String, Donkey> cache2 = new Cache<String, Donkey>() // 或其他方式获得实例 Donkey donkey1 = ... cache2.put("驴甲", donkey1); // 没有编译期错误 Donkey donkey1get = cache2.get("驴甲"); // 没有编译期错误 assertEquals(donkey1, donkey1get); // 如果写 cache2.put("大象", (Elephant)elephant1); 会报编译期错误 |
|
返回顶楼 | |