Class의 인스턴스가 생성된 이후에 내부 상태가 변경 가능한 객체
Class의 인스턴스가 생성된 이후에 내부 상태를 변경할 수 없는 객체
String::toCharArray()의 방어적 복사
public char[] toCharArray() {
// Cannot use Arrays.copyOf because of class initialization order issues
char[] result = new char[value.length];
System.arraycopy(value, 0, result, 0, value.length);
return result;
}
Thread-Safe하여 병렬 프로그래밍에 유용하며 동기화를 고려하지 않아도 된다.
→ 안정성 보장 & 성능상의 이점
실패 원자적인(Failure Atomic) 메서드를 만들 수 있다.
Cache, Map, Set 등의 요소로 활용하기 적합하다.
부수 효과를 피해 오류가능성을 최소화할 수 있다.
다른 사람이 작성한 함수를 예측 가능하며 안전하게 사용할 수 있다.
가비지 컬렉션의 성능을 높일 수 있다.
final String str = "hello";
// str = "world"; // 컴파일 에러
final List<String> list = new ArrayList<>();
list.add("hello");
public final class ImmutableClass {
private final int age;
private final String name;
private final List<String> list;
private ImmutableClass(int age, String name) { // private
this.age = age;
this.name = name;
this.list = new ArrayList<>();
}
public static ImmutableClass of(int age, String name) { // 정적 팩토리 메서드 제공
return new ImmutableClass(age, name);
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
public List<String> getList() {
return Collections.unmodifiableList(list); // 방어적 복사
}
}