Java5泛型,T.class的获取和为擦拭法站台
Java 5的泛型语法已经有太多书讲了,这里不再打字贴书。但真要理解泛式编程的使用,还是要回到它的故乡C 去,靠Java书上的例子只能学到syntax。
GP一定有用,不然Java和C#不会约好了似的同时开始支持GP。但大家也清楚,GP和Ruby式的动态OO语言属于不同的意识形态,如果是一人一票,我想大部分的平民程序员更热衷动态OO语言的平白自然。但如果不准备跳槽到支持JSR223的动态语言,那还是看看GP吧。
胡乱总结泛型的四点作用:
第一是泛化,可以拿个T代表任意类型。 但GP是被C 严苛的静态性逼出来的,落到Java、C#这样的花语平原里,所有对象除几个原始类型外都派生于Object,一样能够很泛,所以Java的Collection类没有范型一样过得好好的。再加上Java的反射功能,在泛的方面GP不占多大优势。
第二是泛型 反射,原本因为Java的泛型拿不到T.class而觉得泛型实在没用,最近才刚刚学到通过反射的API来获取T的Class,泛型开始显得有点用处了,后述。
第三是收敛,就是增加了类型安全,减少了强制类型转换的代码。这点倒是Java Collection历来的弱项。
第四是可以在编译期搞很多东西,比如MetaProgramming。但除非能完全封闭于框架内部,框架的使用者和扩展者都不用学习这些东西的用法,否则那就是自绝于人民的票房毒药。C 的MetaProgramming好厉害吧,但对比一下Python拿Meta Programming生造一个Class出来的简便语法,就明白什么才是真正的叫好又叫座。
所以,作为一个架构设计师,应该使用上述的第2,3项特征,一是在框架类里配合使用反射和泛型,使得框架的能力更强; 二是采用收敛特性,本着对人民负责的精神,用泛型使框架更加类型安全,更少强制类型转换。
而且Java GP的擦拭法实现,使框架的范型特性对使用者保持了可用可不用的选择。
擦拭法避免了Java的流血分裂 :
大家经常骂Java GP的擦拭法实现,但我觉得多亏于它的中庸特性---如果你用就是范型,不用就是普通Object,避免了Java阵营又要经历一场to be or not to be的分裂。
最大的例子莫过Java 5的Collection 框架, 比如有些同学坚持认为自己不会白痴到类型出错,而且难以忍受每个定义的地方都要带一个泛型定义List〈Book〉
通过反射获得 T.class:
不知为何书上不怎么讲这个,是差沙告诉我才知道的,最经典的应用见Hibernate wiki的Generic Data Access Objects, 代码如下:
private Class entityClass;
public BaseHibernateEntityDao() {
entityClass =(Class) ((ParameterizedType) getClass()
.getGenericSuperclass()).getActualTypeArguments()[0];
}
public T get(Serializable id) {
T o = (T) getHibernateTemplate().get(entityClass, id);
}
}
精华就是这句了:
Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
泛型之后,所有BaseHibernateEntityDao的子类只要定义了泛型,就无需再重载getEnttityClass(),get()函数和find()函数,销益挺明显的,所以SpringSide的Dao基类毫不犹豫就泛型了。
- 最新文章
- Ruby On Rails与Jdon Framework架构..[01-04]
- 玩玩Spring之八卦MVC框架与"中庸"..[01-04]
- 想编写出优秀技术文档,先学学这四招[01-04]
- 【新手入门】JSP中标签库的深入研究[01-04]
- 谈谈“模式思想”与框架的关系[01-04]
- 【开发框架】玩玩Spring之IOC(一)[01-04]
- 相关文章
- JAVA测试:使用JMock来实现孤立测试[01-04]
- JAVA编写的拼图游戏移动算法,简单易懂[01-04]
- JavaScript 是怎样让互联网变慢的[01-04]
- JavaFX开发应用中的问题答疑[01-04]
- 利用UML类图设计Java应用程序详解[01-04]
- JavaCard小应用程序结构[01-04]
