ハッシュマップから何かを取得するメソッドがあります。単純化された例 (あまり意味がありませんが、今のところは十分です) は次のとおりです。
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;
}
}