[英]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.