Effective java 优先考虑类型安全的异构容器

本文介绍了如何使用泛型创建一个类型安全的异构容器——Favorites类,该类利用Class对象作为参数化键,使得在保存和检索不同类型的实例时保持类型安全。此外,还探讨了其局限性和相关实现细节,包括使用类型令牌和有限制的类型令牌在运行时读取注解。
摘要由CSDN通过智能技术生成

泛型最常用于集合,如Set和Map<K, V>,以及单元素容器,例如ThreadLocal 和AtomicReference 。在这些用法中,它都充当被参数化了的容器。这样就限制你没个容器只能有固定数目的类型参数。一般来说,这种情况正是你想要的。一个Set只有一个类型参数,表示它的元素类型;一个Map有两个类型参数,表示它的键和值类型;诸如此类。

  但是,有时候你会需要更多的灵活性。例如,数据库行可以有任意多的列,如果能以类型安全的方式访问所有列就好了。幸运的是,有一种方法可以很容易地做到这一点。这种想法就是将键(key)进行参数化而不是将容器(container)参数化。然后将参数化的键提交给容器,来插入或者获取值。用泛型系统来确保值的类型与它的键相符。

  简单地示范一下这种方法:考虑Favorites类,它允许其客户端从任意数量的其他类型中,保存和检索一个最喜爱的实例。Class对象充当参数化键的部分。之所以可以这样,是因为Class类是被泛型化了。类的类型从字面上来看不再只是简单的Class,而是Class。例如,String.class属于Class类型,Tnteger.class属于Class类型。当一个类的字面文字被用在方法中,来传达编译时和运行时的类型信息时,就被称作type token [Bracha04]

  Favorites类的API很简单,它看起来就像一个简单的map,除了键(而不是map)被参数化之外。客户端在设置和获取最喜爱的实例时提交Class对象。下面就是这个API:

// Typesafe heterogeneous container pattern - API
public class Favorites {
    public <T> void putFavorite(Class<T> type, T instance);
    public <T> T getFavorite(Class<T> type);
}

  下面是一个Favorites类练习的示例程序,它保存、检索并打印一个最喜爱的String、Integer和Class实例:

// Typesafe heterogeneous container pattern - client
public static void main(String[] args) {
    Favorites f = new Favorites();
    f.putFavorite(String.class, "Java");
    f.putFavorite(Integer.class, 0xcafebabe);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值