差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
java:effective_java:methods:return_optionals_judiciously [2021/07/05 08:47]
tony [Rule#6: Avoid using Optional in fields, method parameters, and collections.]
java:effective_java:methods:return_optionals_judiciously [2023/06/25 09:48] (目前版本)
行 78: 行 78:
 \\ \\
 支持者的論點,主要有兩點:​ 支持者的論點,主要有兩點:​
-  * 宣告於欄位代表著非必要欄位,語意表達比使用null加註解清楚,更何況大家都不愛寫註解。[[https://​nipafx.dev/​stephen-colebourne-java-optional-strict-approach/​|link]]+  * 宣告於欄位代表著非必要欄位,語意表達比使用null加註解清楚,更何況大家都不愛寫註解。此外,這個Optional支持者反對null,不偏好JodaTime作者的方法。[[https://​nipafx.dev/​stephen-colebourne-java-optional-strict-approach/​|link]]
   * Effective Java Item 55有提及,適用於物件有許多非必要欄位的情況,像是部分更新的UseCaseInput model。如果按照Stuart Marks的建議使用Null Object Pattern,那將會因此建立許多Sub Classes,非常不方便。   * Effective Java Item 55有提及,適用於物件有許多非必要欄位的情況,像是部分更新的UseCaseInput model。如果按照Stuart Marks的建議使用Null Object Pattern,那將會因此建立許多Sub Classes,非常不方便。
   * 在使用Lombok的情況下,有人會想將Optional宣告為field;但被Lombok開發人員打槍,因為他愛null。[[https://​stackoverflow.com/​questions/​31670785/​optional-in-lombok|link]]   * 在使用Lombok的情況下,有人會想將Optional宣告為field;但被Lombok開發人員打槍,因為他愛null。[[https://​stackoverflow.com/​questions/​31670785/​optional-in-lombok|link]]
行 103: 行 103:
 } }
 </​code>​ </​code>​
 +在Java 8的情況下,我提供以下主要的trade-off比較給大家參考:​
 +  * 允許Optional於欄位讓語意清楚:​ 效能較差、維護成本較高(有序列化需求要特別套其它library)。
 +  * 允許null於欄位並僅在回傳值使用Optional:​ 僅有語意問題,null控制好就無大礙。
 ==== Rule#7: Avoid using identity-sensitive operations on Optionals. For example don’t use reference equality == with Optionals. ==== ==== Rule#7: Avoid using identity-sensitive operations on Optionals. For example don’t use reference equality == with Optionals. ====
 這個Rule是告訴大家不要把Optional的物件使用==去操作,要用equals;除了這個以外,也不要把它拿來synchronized。主要原因是Optional本質上是一個包裝物件的box,未來有很大的機會變成Value Type,參考此[[https://​openjdk.java.net/​projects/​valhalla/​|link]]。 這個Rule是告訴大家不要把Optional的物件使用==去操作,要用equals;除了這個以外,也不要把它拿來synchronized。主要原因是Optional本質上是一個包裝物件的box,未來有很大的機會變成Value Type,參考此[[https://​openjdk.java.net/​projects/​valhalla/​|link]]。