### [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。