在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的操作(也就是用==比較兩物件是否相同),否則結果無法預期。
參考:
沒有留言:
張貼留言