我有一个从哈希表中获取某些内容的方法,以下是一个简化的例子(虽然没有太多意义但已足够):
private Map<String,String> map = new HashMap<String,String>();
public String get(String key) {
return map.get(key);
}
当给定的键没有条目时,此方法可以返回null。问题是,我想用@NonNull
注释此方法(因为它在无数个地方使用,我不喜欢Intellij警告我会产生NPE,我也不想关闭该检查,并且我也不想在调用此方法时检查返回值是否与null不同)。这是因为我总是使用一堆始终在映射中的键来使用此方法。因此,由于程序逻辑,此方法必定返回一个@NonNull
值。
我很想只用@NonNull
进行注释,但谁知道有人可能会在某个地方使用除定义键之外的其他东西来调用它,从而实际上导致NullPointerException。你会怎么做?断言听起来很有诱惑力...或者你会改变方法以抛出RuntimException?还是AssertionError?
谢谢。
编辑:
这是实际的实现:
/**
* Typesafe heterogeneous container pattern - implementation
*/
public class HandlersMap {
private final Map<Class<? extends TableHandler>, TableHandler> handlers;
public HandlersMap() {
handlers = new HashMap<Class<? extends TableHandler>, TableHandler>();
putHandler(RolesTableHandler.class, new RolesTableHandler());
putHandler(UsersTableHandler.class, new UsersTableHandler());
putHandler(DevicesTableHandler.class, new DevicesTableHandler());
}
private <T extends TableHandler> void putHandler(@NonNull final Class<T> type, @NonNull final T instance) {
handlers.put(type, type.cast(instance));
}
@NonNull
public <T extends TableHandler> T getHandler(@NonNull final Class<T> type) {
assert handlers.get(type) != null;
return type.cast(handlers.get(type));
}
public Collection<TableHandler> values() {
return handlers.values();
}
public int size() {
return handlers.size();
}
public Map<Class<? extends TableHandler>, TableHandler> getMap() {
return this.handlers;
}
}