Effective Java读书笔记八(Java Tips.Day.8)
来源:互联网 发布:淘宝的免费开店在哪里 编辑:程序博客网 时间:2024/06/06 09:03
TIP29 优先考虑类型安全的异构容器
今天要结束泛型这个部分,所以只有一个tip。不过这个tip涉及到的知识很多,而且是平时可能用的很少的类型相关的只是,最好多多回味,融会贯通。
泛型最常用于集合,比如set,map以及单元素的容器,如ThreadLocal和 AtomicRefrence。
在这些用法中,容器是被参数化的,这样就限制你每个容器只能有固定数目的类型参数。例如,Set、List、只有一个类型参数表示元素类型,Map则有两个类型参数表示键值对。
但有时,会需要更多的灵活性。。
例如,数据库行可以有任意多的列,如果能以类型安全的方式访问所有列就好了。有一种方法可以做到这一点,就是将键(key)参数化,而不是将容器参数化。然后将参数化的键提交给容器,来插入或获取值。
考虑下面的类:
public class Favorites{ public <T> void putFavorite(Class<T> type, T instance); public <T> T getFavorite(Class<T> type);}
这个Favorites作为容器类,我们可以以T的Class<T>
对象作为key,T的实例作为Value来存取喜欢的对象。而我们可以这样来使用:
Favorites f = new Favorites();f.putFavorite(String.class,"Java");f.putFavorite(Integer.class,16);f.putFavorite(Class.class, Favorites.class);String favoriteString = f.getFavorite(String.class);Integer favoriteInt = f.getFavorite(Integer.class);Class<?> favoriteClass = f.getFavorite(Class.class);
是不是很神奇!而Favorites 是类型安全的,当你请求String时,绝对不会返回其它的实例给你。
同时,它也是异构(Heterogeneous) : 因为它不像普通的Map,它的Key是不同类型的。
因此,我们称之为类型安全的异构容器。
下面来看看完整的Favorites 实现:
public class Favorites{ private Map<Class<?>, Object> favorites = new HashMap<Class<?>, Object>(); public <T> void putFavorite(Class<T> type, T instance){ if (null == type){ throw new NullPointException("Type is null"); } favorites.put(type,instance); }; public <T> T getFavorite(Class<T> type){ return type.cast(favorites.get(type)); }}
注意在getFavorite 方法中,我们利用Class的cast方法,将引用动态地转换成Class对象所表示的类型。
这一个知识点,值得反复回味咀嚼。
1 0
- Effective Java读书笔记八(Java Tips.Day.8)
- Effective Java读书笔记一(Java Tips.Day.1)
- Effective Java读书笔记二(Java Tips.Day.2)
- Effective Java读书笔记五(Java Tips.Day.5)
- Effective Java读书笔记六(Java Tips.Day.6)
- Effective Java读书笔记九(Java Tips.Day.9)
- Effective Java读书笔记十(Java Tips.Day.10)
- Effective Java读书笔记十一(Java Tips.Day.11)
- Effective Java读书笔记十二(Java Tips.Day.12)
- Effective Java读书笔记十三(Java Tips.Day.13)
- Effective Java读书笔记十四(Java Tips.Day.14)
- Effective Java读书笔记十五(Java Tips.Day.15)
- Effective Java读书笔记十六(Java Tips.Day.16)
- Effective Java读书笔记十七(Java Tips.Day.17)
- Effective Java读书笔记十九(Java Tips.Day.19)
- Effective Java读书笔记二十(Java Tips.Day.20)
- Effective Java读书笔记二一(Java Tips.Day.21)
- Effective Java读书笔记二二(Java Tips.Day.22)
- Android中循环获取图片资源Id并运用到GridView等的适配器之中
- 2016年第七届山东省ACM省赛题解
- 《Linux与shell脚本编程大全》笔记之shell命令补充
- SQL之case when then用法
- react子组件如何向父组件传值
- Effective Java读书笔记八(Java Tips.Day.8)
- QT5实现简单的TCP通信
- Redis初探04——Redis的list类型及操作
- R语言绘制K线图
- Android自定义加载动画库zLoading
- 算法思想汇总(日后补充)
- 欢迎使用CSDN-markdown编辑器
- 【php学习之路】水印功能的基本实现
- 内部服务器-500错误问题