網頁

2019/5/5

Java 什麼是Value-based Classes

在Java的API如文件中,有時可以看到value-based classes的敘述,那什麼是Value-based Classes?

例如Java 8 的LocalDateOptional API文件中關於value-based的敘述:

This is a value-based class; use of identity-sensitive operations (including reference equality (==), identity hash code, or synchronization) on instances of Optional may have unpredictable results and should be avoided.


Value-based類別的特性

  • 有宣告final,也就是immutable,類別內容不可被修改(但內容中的物件可以是mutable)。
  • 有實作equals()hashCode(), toString(),且實作內容僅依據實例自身的狀態,而不依賴外面其他的的物件狀態或變數。
  • 不使用物件識別敏感(identity-sensitive)的操作,包括以==比較兩物件,使用實例的identity hash code(就是使用JVM依記憶體位置產生的hash code),不使用物件的intrinsic lock(內置鎖/內在鎖)同步
  • 兩實例是否相同是根據equals()而非==
  • 無公開的建構式,而是以工廠方法(Factory method)來產生實例。
  • 若兩個實例相同,則可以互相替代,且不會有不同的行為。

應該避免對value-based的物件進行identity-sensitive的操作(也就是用==比較兩物件是否相同),否則結果無法預期。


參考:

沒有留言:

張貼留言