深入了解Java泛型(五) -- 类型令牌
2009-05-10 09:09
218 查看
可以考虑下这样的场景:假设我的一个应用中有很多类都是"无状态"的,并且实例化一个这种类是很费资源的,更糟的是发现这些类没有一个是单例的,这个时候可以考虑在外部编写一个单例的缓存,使用这个缓存来维护这些类的实例。
考虑到类型安全性,我想使用泛型去实现这个缓存,但是泛型一般只能有有限的类型参数,比如Set和List有1个,Map有2个,这个时候就可以考虑不将缓存泛型化,而将缓存的键泛型化。说了这么多还是看看具体的代码吧。
这个类很简单,SingletonClassCache并没有泛型化,而是把内部的静态成员cache的键变成了Class<?>类型,这样就可以通过它的两个泛型方法去实现安全的缓存单例了。
运行结果当然都是true,说明引用指向的都是同一个对象。
上边的这种用法就是所谓的类型令牌了。通过这种方式,可以增加泛型的灵活性,但是这种方式也有一个很大的缺点。比如List<String>这种泛型类型的对象是不能通过类型令牌保存的,因为泛型类型在运行时是会擦除泛型信息的,List<String>.class是会报出语法错误的,这样其实也更安全,因为List<String>和List<Integer>其实用的是同一个Class对象。 阅读更多
考虑到类型安全性,我想使用泛型去实现这个缓存,但是泛型一般只能有有限的类型参数,比如Set和List有1个,Map有2个,这个时候就可以考虑不将缓存泛型化,而将缓存的键泛型化。说了这么多还是看看具体的代码吧。
public class SingletonClassCache {
private static Map<Class<?>, Object> cache = new HashMap<Class<?>, Object>();
public static synchronized <T> void put(T t) {
cache.put(t.getClass(), t);
}
public static synchronized <T> T get(Class<T> clazz) {
return clazz.cast(cache.get(clazz));
}
}
这个类很简单,SingletonClassCache并没有泛型化,而是把内部的静态成员cache的键变成了Class<?>类型,这样就可以通过它的两个泛型方法去实现安全的缓存单例了。
public class TypeTokenTester {
public static void main(String[] args) {
String s = new String("string");
SingletonClassCache.put(s);
Integer i = new Integer(1);
SingletonClassCache.put(i);
System.out.println(s == SingletonClassCache.get(String.class));
System.out.println(i == SingletonClassCache.get(Integer.class));
}
}
运行结果当然都是true,说明引用指向的都是同一个对象。
上边的这种用法就是所谓的类型令牌了。通过这种方式,可以增加泛型的灵活性,但是这种方式也有一个很大的缺点。比如List<String>这种泛型类型的对象是不能通过类型令牌保存的,因为泛型类型在运行时是会擦除泛型信息的,List<String>.class是会报出语法错误的,这样其实也更安全,因为List<String>和List<Integer>其实用的是同一个Class对象。 阅读更多
相关文章推荐
- 深入了解JAVA泛型
- C#集合类型的深入了解
- JavaScript 深入了解基本类型和引用类型的值
- 深入了解JavaScript对象(1)--原始类型和引用类型
- 对Java字符类型的深入了解(转贴) .
- 深入了解Python数据类型之列表
- JavaScript 参数 arguments深入了解以及javascript内置数据类型的讨论
- 深入了解java泛型
- c#基础-类型基础深入了解
- [置顶] 【R语言数据类型】深入了解 向量、矩阵、数据框、列表
- 深入了解不同类型的服务器防火墙
- 深入了解Java类型生命周期
- 深入了解虚拟函数的静态类型和动态类型
- 深入了解mysql的4种常用、重要的数据类型
- 【深入Java泛型】(2)java泛型-类型擦除
- 惭愧,直到今天才对“数据类型字节对齐”有个深入的了解,对以前读书时学习的知识没有深刻理解啊 C/C++学习 C/C++学习 漫漫人生,澎湃的经历不断促使改变自己,永恒不变的是一颗骄傲的心!
- 深入了解PHP类型戏法 (array)var 强制数组转换
- 深入了解Python数据类型之列表
- 深入了解 Number 类型
- JavaScript 深入了解基本类型和引用类型的值