dnc*_*253 21 java parameterized
我不确定我想做什么是可能的,但如果是的话,我想知道如何做.基本上,我想创建一个Map,其中键是一个class(java.lang.Class),该条目的值是该类的一个实例.目前我有
private Map<Class<?>, Object> myMap = new HashMap<Class<?>, Object>();
Run Code Online (Sandbox Code Playgroud)
但是,这意味着任何Object都可以放在Map中.如果有可能,我想制作它,因此只能将键中的类的实例放置在地图中.有没有办法使用?在Class上进行参数化以确保这一点?
此外,我发现在做这样的事情时可能会有内存泄漏.我不确定我是否完全理解这是怎么发生的.我只会将单个对象粘贴到地图中,那么是否仍会出现内存泄漏问题?如果是这样,我该如何预防呢?
Lou*_*man 14
Java的类型系统根本不足以强制执行您直接描述的类型约束,并且您需要执行一些不安全的转换以使其工作 - 或者将其包装Map在其他强制类型安全的API中. Guava ClassToInstanceMap正是为了这个用例而提供的,提供了一个外部安全的API,Map它对接口施加了额外的限制以使其工作.(披露:我向番石榴捐款.)
这可能导致内存泄漏的唯一时间是,如果您在此处使用的某些类在应用程序的生命周期内不会保留.对于许多用户来说,这不是一个问题,特别是如果您正在编写一个"服务器端"应用程序而不关心卸载未使用的类.
您使用的是异构容器.这些可以通过使用类型标记(如你已经这样做),并进行类型安全Class.cast()与正确的应用逻辑:所以有内选中suppressWarning Class.cast(),但应用程序逻辑保证正确性.
我建议你阅读Josh Bloch的Effective Java Item 29:考虑类型安全的异构容器.他的榜样是:
// Typesafe heterogeneous container pattern - implementation
public class Favorites {
private Map<Class<?>, Object> favorites =
new HashMap<Class<?>, Object>();
public <T> void putFavorite(Class<T> type, T instance) {
if (type == null)
throw new NullPointerException("Type is null");
favorites.put(type, instance);
}
public <T> T getFavorite(Class<T> type) {
return type.cast(favorites.get(type));
}
}
Run Code Online (Sandbox Code Playgroud)
如果你持有你实际上不再需要的任意多种不同的类型,我只会看到内存泄漏的可能性.
您可以隐藏集合,只允许通过访问器方法访问它.
private final Map<Class, Object> myMap = new HashMap<Class, Object>();
public <T> void putMap(Class<T> tClass, T t) {
myMap.put(tClass, t);
}
@SuppressWarnings("unchecked")
public <T> T getMap(Class<T> tClass) {
return (T) myMap.get(tClass);
}
Run Code Online (Sandbox Code Playgroud)
警告可以忽略,因为您知道即使编译器没有,最后一个方法中的强制转换也是安全的.
| 归档时间: |
|
| 查看次数: |
21095 次 |
| 最近记录: |