Effective Java - 클래스와 멤버의 접근 권한을 최소화하라

2025. 2. 1. 00:04JAVA/Effective Java

Item 15. 클래스와 멤버의 접근 권한을 최소화하라

// 보안 허점이 숨어 있다.
public static final Thing[] VALUES = { ... };

 

final 키워드는 참조 타입에서 사용시 참조된 객체를 재할당하는 것은 불가능하지만 참조된 객체의 내부 요소까지 보호하지는 않는다. 즉 다음과 같은 문제가 발생할 수 있다.

// 참조된 객체 내부 요소를 수정할 수 있다.
VALUES[0] = new Thing();

 

이를 해결하기 위해서는 두 가지 해결책이 존재한다.

첫 번째 방법은 public 배열을 private 으로 변경하고 public 불변 리스트를 추가한다.

private static final Thing[] PRIVATE_VALUES = { ... };
public static final List<Thing> VALUES = 
	Collections.unmodifiableList(Arrays.asList(PRIVATE_VALUES));

 

두 번째 방법은 마찬가지로 public -> private 으로 변경하고 그 복사본을 반환하는 public 메소드를 추가한다. (방어적 복사)

private static final Thing[] PRIVATE_VALUES = { ... };
public static final Thing[] values() {
	return PRIVATE_VALUES.clone();
}