隨機示例:在我的一個程式的源代碼中,我有這種方法:
public @NotNull Currency[] getCurrencies() {
return this.currencies.values().toArray(new Currency[0]);
}
編譯后,我的 IDE (Intellij) 將其變成以下內容:
@NotNull
public Currency[] getCurrencies() {
Currency[] var10000 = (Currency[])this.currencies.values().toArray(new Currency[0]);
if (var10000 == null) {
$$$reportNull$$$0(4);
}
return var10000;
}
this.currencies指private final ConcurrentHashMap<String, Currency> currencies = new ConcurrentHashMap();- 這意味著只有通過反射或宇宙射線導致位翻轉,該方法getCurrencies()才能回傳null。
- 我應該 - 在沒有機會
null回傳的情況下 - 放棄使用@NotNull注釋嗎? - 注釋是否甚至會對性能產生重大影響,或者注釋的好處是否超過了性能影響?
謝謝
/edit:我正在使用注釋包 org.jetbrains.annotations
uj5u.com熱心網友回復:
@NotNull不是編譯器的注釋。編譯器可能會使用這個注解并做一些額外的檢查。但是@NotNull對于閱讀編譯器檢查的代碼的人來說,這是一個注釋。在 Java 的許多問題中,迄今為止最大的問題是null無處不在的未檢查值的普遍性。在其他靜態型別語言中,程式中任何地方的任何變數都可能根本不存在,并且違反了型別檢查器可以提供的所有保證。
Kotlin 具有適當的可為空型別。Scala 的最新版本具有(選擇加入)可為空的型別。甚至新版本的 C# 也具有可為空的型別。在 Java 中,@NotNull應該被認為是你的函式契約的一部分,幾乎是它的型別的一部分。你不是在說“嘿,編譯器,檢查這是否是null”。你說“我保證這個函式永遠不會回傳null”并且編譯器正在檢查它,就像宣告一個回傳型別String是保證你回傳一個String. @NotNull因為您確定它是正確的而洗掉注釋無異于將所有回傳型別更改為,Object因為您知道函式回傳的型別。如果你認為
String getName(String prefix) { ... }
看起來比
Object getName(Object prefix) { ... }
那么你應該認為
@NotNull String getName(@NotNull String prefix) { ... }
看起來更好。是更有力的保證。
uj5u.com熱心網友回復:
null檢查你的吸氣劑有點奇怪。在您呼叫 getter 時,您的物件已經處于不應處于的狀態。您可能希望將@NotNullon 引數用于您的 setter 或建構式。
您可以做的是為您的getCurrencies.
/**
/* @return An array of currencies. Never null.
*/
public Currency[] getCurrencies() {}
但是記錄一個方法沒有回傳是非常罕見的null。不回傳null應該是黃金標準,如果一個方法可以回傳null它應該被記錄,而不是相反。此外,我不希望回傳一組資料(陣列、串列等)的 getter 回傳null。而是回傳一個空物件。
uj5u.com熱心網友回復:
根據需要使用@Nullable和@NotNull;這些注釋只是為了改進 Kotlin 互操作性,但在 Java 中沒有真正的用途(至少我不會知道)。編譯后它們什么都沒有留下,因此相信這會影響性能是值得懷疑的。當問這些基本的事情,但又關心性能時,這可能會建議重新考慮優先級。功能>性能;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/422656.html
標籤:
上一篇:在python中更快地讀取檔案
