gpt4 book ai didi

java - 为什么 "TypeToken Collections"被认为是类型安全的? (有效的 Java #29)

转载 作者:搜寻专家 更新时间:2023-11-01 02:26:25 24 4
gpt4 key购买 nike

Item #29在 Effective Java 中提出了一种实现“类型安全”异构集合的方法,基本上可以归结为如下内容:

public Class HeterogeneousContainer {
private Map<Class<?>, Object> container = new HashMap<>();

public <T> put(Class<T> type, T instance) {
container.put(type, instance);
}

public <T> T get(Class<T> type) {
//essentially just
// return (T) container.get(type);
return type.cast(container.get(type));
}
}

然后(我推测)将像这样(由制作人)使用:

List<HeterogeneousContainer> resultSet = new ArrayList<>();
...
resultSet.add(new HeterogeneousContainer());
...
resultSet.get(rowIndex).add(Column1.class, column1Value);
resultSet.get(rowIndex).add(Column2.class, column2Value);
...

像这样(由消费者):

for(HeterogeneousContainer row:resultSet) {
Column1 column1Value = row.get(Column1.class);
Column2 column2Value = row.get(Column2.class);
...
//do something with the columnValues
}

我现在的问题是为什么这被认为是类型安全的?这比仅将列名称放入 map 或仅使用常规 List 更好吗?/List<Object>并按索引查找列?

这是否以任何方式有效/实际地改进了 JDBC ResultSets 的 .getString/.getInt/.getXXXX 方法?

最佳答案

这个类被认为是类型安全的,因为即使它在运行时进行类转换,这种不安全的行为也会被封装,您无法观察到它。

  • container 字段是私有(private)的,因此在考虑类型安全时,您只需检查该类内部的代码即可。
  • put 方法插入一对类型标记T T 类型的元素。这是唯一更新 container 的地方,并且保证(在编译时)插入的元素具有正确的类型标记。
  • get 方法以不安全的方式执行类转换(return type.cast(container.get(type))),但是只要确保 container 仅通过 put 修改,就不会失败。在上面我们看到 put 当然是唯一的方法,这个类对其用户类型安全的。

说实话,如果你真的想,你可以打破这个类的类型安全,例如使用反射。通常这无关紧要,因为您想为您的类辩护,因为它被意外滥用而不是有意损坏。然而,当您进一步阅读 Effective Java 时,您会发现防御此类攻击要复杂得多。

关于java - 为什么 "TypeToken Collections"被认为是类型安全的? (有效的 Java #29),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22028199/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com