2017-05-29 58 views
3

我的類的其中一個字符串成員變量是可選的。用Lombok註釋@NonNull標記它是否合理?將可選成員變量標記爲NonNull

我想問一個問題,如果成員變量是Map而不是String。答案會改變嗎?

+0

如果使用'@ NonNull'對其進行註釋,則即使您不需要它,您也必須始終對其進行初始化。我認爲關於內存使用情況並不算太壞。同樣的任何數據類型我會認爲 – XtremeBaumer

+0

沒有得到這部分 - 「我會認爲它不是太糟糕的內存使用情況」。我在想,如果我使NonNull有助於避免空檢查,但是通過該邏輯去除所有字段(除了原語)都應該標記爲NonNull。還標有NonNull並不意味着它必須每次都被初始化......因爲我可以給出默認值..對嗎?所以我不必通過建設者 – Andy897

+0

明確地初始化它,請告訴我們你使用了哪個@NonNull。如果它的龍目自己的,那麼你有另一個默認值的註釋。關於你不明白的一點:如果你初始化一個變量,你不需要你的對象的大小會增加(一些位/字節)。這將意味着你會浪費內存和更多的對象,你會浪費更多的內存 – XtremeBaumer

回答

2

可選的要點是做出流暢的API。現場不是,也不應該是 API的一部分。

你在Optional<Object> objObject obj之間的區別是什麼?

這兩個字段都可以註釋爲@NotNull。 使用@NotNull註釋字段將給出與註釋Optional相同的結果,但不會有任何額外的呼叫,如ifPresent()。如果要使用Optional將鏈接操作應用於字段 - 您以錯誤的方式使用Optional。沒有理由在字段中使用Optional

您可以在openjdk郵件列表optional discussion中閱讀更多信息。

有可選能夠做流暢的API mail.openjdk

1

是的,你應該標記每Optional變量作爲@NonNull

可選類型的變量不能爲空。 Stuart Marks的rules about use of Optional開始於:

  1. 永遠不會對可選變量或返回值使用null。

如果您編寫@NonNull,那麼您將獲得工具幫助以確保您不違反此重要規則。

如果您不寫@NonNull,那麼您只有自己的個人紀律,以防止您犯錯,而且客戶也可能犯錯。

因此,您應該編寫@NonNull,它用作機器可讀和機器檢查的文檔,該變量不應該爲空。

這不僅適用於字段(成員變量),也適用於您使用Optional的任何地方。

+1

但是也請閱讀規則6:避免在字段,方法參數和集合中使用Optional。 –

+0

是的,還讀了其他規則。但是,它們與原始問題無關。如果你有一個可選類型的字段,它應該是'@ NonNull'。 – mernst