簡體   English   中英

返回null的方法中的java @Nonnull批注

[英]java @Nonnull annotation in a method that returns null

我有一個從哈希圖中獲取內容的方法,一個簡化的示例(雖然沒有多大意義,但目前已經足夠好了)是:

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

}

@Nonnull注釋而不驗證給定密鑰是否存在絕對是錯誤的選擇。

由於您似乎表明給定鍵應該存在,所以這意味着缺少鍵是無效的參數,因此檢查這種情況並為缺少的元素拋出IllegalArgumentException是正確的做法。

另外,根據地圖的初始化方式,您可能需要考慮為鍵值創建一個枚舉,使用EnumMap代替HashMap ,並讓get()方法使用此枚舉而不是自由格式的String 這樣,您將進行一些編譯時檢查,以確保也使用正確的值。

即使在那種情況下,您仍然需要檢查是否存在,以防萬一請求的枚舉值尚未添加到地圖中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM