이펙티브 자바 17
변경 가능성 최소화
불변 클래스란 인스턴스 내부 값을 수정할 수 없는 클래스이다. 객체가 파괴되는 순간까지 절대 수정할 수 없다. (ex : String, BigInteger, BigDecimal) 이러한 불변 클래스들은 가변 클래스보다 설계하고 구현이 쉬우며, 훨씬 안전하다.
불변 클래스의 규칙
-
- 객체의 상태를 변경하는 메서드를 제공하지 않는다.
-
- 클래스를 확장할 수 없도록 한다. (기본적으로 final 선언)
-
- 모든 필드를 final로 선언한다. (스레드 안전 보장)
-
- 모든 필드를 prviate으로 선언한다.
-
- 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다.
( 클래스에 가변 객체를 참조하는 필드가 하나라도 있으면 클라이언트에서 그 객체의 참조를 얻을 수 없도록 해야한다. )
- 자신 외에는 내부의 가변 컴포넌트에 접근할 수 없도록 한다.
위의 규칙들을 만족하는 클래스
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);
}
}
불변 객체는 스레드 사용으로부터 안전 보장이 되기 때문에 자유록게 공유할 수 있음은 물론, 불변 객체끼리는 내부 데이터를 공유할 수 있다.
객체를 만들 때 다른 불변 객체들을 구성요소로 사용하면 이점이 많다. 불변의 객체는 맵의 키와 집합의 원소로 쓰기에 매우 좋다.
Author And Source
이 문제에 관하여(이펙티브 자바 17), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@chamchi_i/이펙티브-자바-17저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)