可以考虑下这样的场景:假设我的一个应用中有很多类都是"无状态"的,并且实例化一个这种类是很费资源的,更糟的是发现这些类没有一个是单例的,这个时候可以考虑在外部编写一个单例的缓存,使用这个缓存来维护这些类的实例。
考虑到类型安全性,我想使用泛型去实现这个缓存,但是泛型一般只能有有限的类型参数,比如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 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力【泛型】---- 代码 Java 第二阶段提升编程能力...
全面总结Java泛型--实例
个人制作且上课使用的课件,希望对大家初步了解泛型相关内容有一定的帮助。个人制作且上课使用的课件,希望对大家初步了解泛型相关内容有一定的帮助。
泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。 Java语言引入泛型的好处是...
【Java基础】泛型方法 - 右撇子 - 博客频道 - CSDN.NET
补充知识:泛型1---马克-to-win java视频的详细描述与介绍
java 泛型类的类型识别示例 java 泛型类的类型识别示例 java 泛型类的类型识别示例
Delphi泛型库--DGL(The Delphi Generic Library) 在Delphi中实现的类型安全、高效、易用的泛型容器和算法库;借鉴了C++标准中的STL;
Java泛型编程指南.pdf 此文章译自SUN的泛型编程指南
java泛型深入.pdf
Java Generics and Collections 英文版,详细描述java 泛型技术
这是一个使用JAVA实现的泛型编程,分为两部分,第一部分创建泛型类,并实例化泛型对象,得出相加结果。 第二部分用户自行输入0--4,选择要进行的加减乘除运算或退出,再输入要进行运算的两个数,并返回运算结果及...
补充知识2 ---马克-to-win java视频泛型的详细描述与介绍
java,学习java泛型,java培训之泛型.pptxjava培训之泛型.pptxjava培训之泛型.pptxjava培训之泛型.pptx
Java泛型和集合]-英文版
泛型应用--图的深度(广度)优先遍历.成语接龙例
java泛型源码Java泛型用法 步骤1 原始类型有问题。 第2步 使用泛型类型。 第三步 车库和车辆。 原始类型。 第四步 首先尝试生成车库。 木星在我的车库里。 第5步 泛型上限。 第6步 TripleGarage 步骤7 试图使用泛型...
java 泛型接口示例 java 泛型接口示例 java 泛型接口示例
深入理解java泛型,包括类名泛型的定义,方法泛型定义,泛型的返回
day02【Collection、泛型】-笔记.md