Java-Value-Base

Posted by Adam on August 24, 2022
### [Java 什麼是Value-based Classes ](https://matthung0807.blogspot.com/2019/05/java-value-based-classes.html) 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的操作(也就是用==比較兩物件是否相同),否則結果無法預期。 --- 要實作一個 Value-based Class,需要注意以下幾點: 1. 覆寫 `equals()` 和 `hashCode()` 方法:確保兩個值相同的物件被視為相等並且有相同的 hashCode。 2. 覆寫 `toString()` 方法:提供對象的易讀的字串表示形式。 3. 實作 Immutable Object:確保值對象是不可變的,即不可修改其內部狀態。 以下是一個簡單的範例,實作一個 `Point` 類別作為 Value-based Class: ```java public final class Point { private final int x; private final int y; public Point(int x, int y) { this.x = x; this.y = y; } public int getX() { return x; } public int getY() { return y; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Point point = (Point) o; return x == point.x && y == point.y; } @Override public int hashCode() { return Objects.hash(x, y); } @Override public String toString() { return "(" + x + ", " + y + ")"; } } ``` 這樣就可以實作一個簡單的 Value-based Class。請注意,這個範例中的 `Point` 類別是不可變的,並有覆寫 `equals()`、`hashCode()` 和 `toString()` 方法。這樣就確保了該類別是一個 Value-based Class。