불변 클래스란 인스턴스 내부 값을 수정할 수 없는 클래스이다. 객체가 파괴되는 순간까지 절대 수정할 수 없다. (ex : String, BigInteger, BigDecimal) 이러한 불변 클래스들은 가변 클래스보다 설계하고 구현이 쉬우며, 훨씬 안전하다.
위의 규칙들을 만족하는 클래스
public final class
public final class Complex {
private final double re;
private final double im;
public Complex(double re, double im)
{
this.re = re;
this.im = im;
}
public double realPart()
{return re;}
public double imaginaryPart()
{return im;}
public Complex plus(Complex c){
return new Complex(re + c.re, im + c.im)
}
public Complex minus(Complex c){
return new Complex(re - c.re, im - c.im);
}
public Complex times(Complex c){
return new Complex(re * c.re - im * c.im, re * c.im + im * c.re);
}
public Complex divideBy(Complex c){
double tmp = c.re*c.re + c.im * im;
return new Complex((re * c.re + im * c.im)/tmp, (im * c.re - re * c.im)/ tmp);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Complex complex = (Complex) o;
return Double.compare(complex.re, re) == 0 && Double.compare(complex.im, im) == 0;
}
@Override
public int hashCode() {
return Objects.hash(re, im);
}
}
불변 객체는 스레드 사용으로부터 안전 보장이 되기 때문에 자유록게 공유할 수 있음은 물론, 불변 객체끼리는 내부 데이터를 공유할 수 있다.
객체를 만들 때 다른 불변 객체들을 구성요소로 사용하면 이점이 많다. 불변의 객체는 맵의 키와 집합의 원소로 쓰기에 매우 좋다.