本文介紹了Java可選&t;T&>問題,我這樣做正確嗎?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我有一個”壞習慣”,當某些東西不存在時,我會把null
拋到其他地方,比如枚舉數。
示例:
private enum Foo {
NULL(1, null, 2),
NOT_NULL(3, new Bar(), 4);
private int a, c;
private Bar b;
Foo(int a, Bar b, int c) {
this.a = a;
this.b = b;
this.c = c;
}
}
所以現在我嘗試將我的代碼轉換為使用Optional<T>
,就像每個人建議的那樣,但我不確定我這樣做是否正確。
以下是我的代碼(修剪后的枚舉):
public static enum Difficulty {
EASY, MEDIUM, HARD
}
public static enum SlayerTasks {
NONE(0, Optional.empty(), Optional.empty(), Optional.empty()),
NPC(1, Optional.of(Difficulty.EASY), Optional.of("That one place."), Optional.of(1));
private int taskId;
private Optional<Difficulty> difficulty;
private Optional<String> location;
private Optional<Integer> npcId;
SlayerTasks(int taskId, Optional<Difficulty> difficulty, Optional<String> location, Optional<Integer> npcId) {
this.taskId = taskId;
this.difficulty = difficulty;
this.location = location;
this.npcId = npcId;
}
public int getTaskId() {
return taskId;
}
public Difficulty getDifficulty() {
return difficulty.get();
}
public String getLocation() {
return location.get();
}
public int getNpcId() {
return npcId.get();
}
}
讓我感到困擾的是參考#get()
Foundhere的文檔,其中顯示:
如果此可選參數中存在值,則返回該值,否則引發NoSuchElementException異常。
因此,我認為為了防止出現這種情況,我應該將getter包裝在#isPresent()
中,但是我不知道如何返回空。
這是正確的做事方式嗎,還是我錯過了什么?我不是在尋找”解決辦法”,我是在尋找有關效率和適當實踐的信息。
推薦答案
您需要問問自己,如果沒有任何可返回的內容,您希望Getter做什么。
實際上只有四個選項:
-
返回空值(但隨后返回到您試圖避免的位置);
讓您的getter返回
Optional<T>
而不是T
;如果未設置,則返回默認值;
引發異常。
我會選擇2,除非對于缺省值應該是什么有一個非常明確的正確答案。只有當客戶端代碼應該總是知道是否有什么東西存在并且只有在有的時候才請求它時,4才是合適的(這將是不尋常的,但不是不可能的)。
這篇關于Java可選&t;T&>問題,我這樣做正確嗎?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,