1

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

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;
    }

}
4

1 に答える 1