在Java的API如文件中,有時可以看到value-based classes的敘述,那什麼是Value-based Classes?
例如Java 8 的LocalDate
及Optional
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.
- 有宣告
final
,也就是immutable,類別內容不可被修改(但內容中的物件可以是mutable)。 - 有實作
equals()
,hashCode()
,toString()
,且實作內容僅依據實例自身的狀態,而不依賴外面其他的的物件狀態或變數。 - 不使用物件識別敏感(identity-sensitive)的操作,包括以
==
比較兩物件,使用實例的identity hash code(就是使用JVM依記憶體位置產生的hash code),不使用物件的intrinsic lock(內置鎖/內在鎖)同步 - 兩實例是否相同是根據
equals()
而非==
。 - 無公開的建構式,而是以工廠方法(Factory method)來產生實例。
- 若兩個實例相同,則可以互相替代,且不會有不同的行為。
應該避免對value-based的物件進行identity-sensitive的操作(也就是用==
比較兩物件是否相同),否則結果無法預期。
參考:
沒有留言:
張貼留言