불변 클래스는 가변 클래스보다 설계하고 구현하고 사용하기 쉬우며, 오류가 생길 여지도 적고 훨씬 안전하다.
멀티 스레드 환경에서 안전하다.
불변 클래스를 만드는 다섯 가지 규칙
public final class PhoneNumber { // final 선언 : 상속 방지
private final short areaCode, prefix, lineNum; // field final keyword 선언
// PhoneNumber.filedName (x)
public PhoneNumber(short areaCode, short prefix, short lineNum) {
this.areaCode = areaCode;
this.prefix = prefix;
this.lineNum = lineNum;
}
public short getAreaCode() {
return areaCode;
}
public short getPrefix() {
return prefix;
}
public short getLineNum() {
return lineNum;
}
}
함수형 프로그래밍에 적합하다. (피연산자에 함수를 적용한 결과를 반환하지만 피연산자가 바뀌지는 않는다.)
불변 객체는 단순하다.
불변 객체는 근본적으로 스레드 안전하여 따로 동기화할 필요 없다.
불변 객체는 안심하고 공유할 수 있다. (상수, public static final)
불변 객체 끼리는 내부 데이터를 공유할 수 있다.
public class BigIntExample {
public static void main(String[] args) {
BigInteger ten = BigInteger.TEN;
BigInteger minusTen = ten.negate();
final Set<Point> points = new HashSet<>();
Point firstPoint = new Point(1, 2);
points.add(firstPoint);
}
}
객체를 만들 때 불변 객체로 구성하면 이점이 많다.
실패 원자성을 제공한다. (아이템 76, p407)
단점) 값이 다르다면 반드시 별도의 객체로 만들어야 한다.
“다단계 연산”을 제공하거나, “가변 동반 클래스”를 제공하여 대처할 수 있다
public class StringExample {
public static void main(String[] args) {
String name = "whiteship";
StringBuilder nameBuilder = new StringBuilder(name);
nameBuilder.append("keesun");
}
}