完全可自行建立唯讀類別。下例示範 Immutable1:
//: Immutable1.java
public class Immutable1 {
private int data;
public Immutable1(int initVal) { data = initVal; }
public int read() { return data; }
public boolean nonzero() { return data != 0; }
// 需修改時回傳新物件,原物件不變
public Immutable1 quadruple() { return new Immutable1(data * 4); }
static void f(Immutable1 i1) {
Immutable1 quad = i1.quadruple();
System.out.println("i1 = " + i1.read());
System.out.println("quad = " + quad.read());
}
public static void main(String[] args) {
Immutable1 x = new Immutable1(47);
System.out.println("x = " + x.read());
f(x);
System.out.println("x = " + x.read()); // x 未被修改
}
} ///:~
所有資料設為 private,無任何 public 方法修改資料。quadruple() 雖名為修改,實則建立新物件回傳,原物件原封未動。
f() 接收 Immutable1 並操作,main() 輸出證明 x 未變。因此 x 可被多重別名引用而無副作用——Immutable1 設計保證物件不被改動,從根本解決別名問題。