이펙티브 자바 17

변경 가능성 최소화

불변 클래스란 인스턴스 내부 값을 수정할 수 없는 클래스이다. 객체가 파괴되는 순간까지 절대 수정할 수 없다. (ex : String, BigInteger, BigDecimal) 이러한 불변 클래스들은 가변 클래스보다 설계하고 구현이 쉬우며, 훨씬 안전하다.

불변 클래스의 규칙

    1. 객체의 상태를 변경하는 메서드를 제공하지 않는다.
    1. 클래스를 확장할 수 없도록 한다. (기본적으로 final 선언)
    1. 모든 필드를 final로 선언한다. (스레드 안전 보장)
    1. 모든 필드를 prviate으로 선언한다.
    1. 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다.
      ( 클래스에 가변 객체를 참조하는 필드가 하나라도 있으면 클라이언트에서 그 객체의 참조를 얻을 수 없도록 해야한다. )

위의 규칙들을 만족하는 클래스

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);
    }
}

불변 객체는 스레드 사용으로부터 안전 보장이 되기 때문에 자유록게 공유할 수 있음은 물론, 불변 객체끼리는 내부 데이터를 공유할 수 있다.

객체를 만들 때 다른 불변 객체들을 구성요소로 사용하면 이점이 많다. 불변의 객체는 맵의 키와 집합의 원소로 쓰기에 매우 좋다.

좋은 웹페이지 즐겨찾기