이펙티브 자바 #item4 인스턴스를 막으려거든 private 생성자를 사용하라

임현규·2023년 1월 2일
0

이펙티브 자바

목록 보기
4/47
post-thumbnail

생성자 접근 제한 예제

builder 패턴

이전에 builder 패턴을 사용할 때 인스턴스를 생성하는 생성자를 private 또는 protected를 사용했다. 그 이유는 외부에서 직접 생성자를 호출하는 것이 아닌 오직 nested class의 builder 만이 생성자를 호출하기 위함이였다. 즉 어떤 클래스 또는 객체가 해당 객체를 생성할 책임을 가지게 하고 싶을 때 private, protected를 활용한다.

spring proxy, cglib

spring에서 proxy객체를 만들 때 cglib 또는 java의 reflection의 프록시를 활용한다. 이 때 cglib의 경우 class를 상속받아 proxy를 동적으로 생성한다. 해당 생성자를 외부에서 호출을 막고 싶지만 프레임워크가 상속해서 활용해야되는 경우 protected로 둔다.

utillity class

객체지향적인 방식과는 거리가 있지만 경우에 따라 계산이 복잡하거나 helper method가 필요하지만 클래스로 분리해야하는 경우 사용할 수 있다. 이 경우 기본 생성자를 private으로 설정하지 않으면 인스턴스를 실수로 생성할 우려가 있다. 이런 경우 기본 생성자를 private으로 설정하거나 생성자 호출시 예외를 던지는 방법이 있다. 생성자 호출시 예외는 reflection 공격에도 방어적이긴 하지만 너무 오버 엔지니어링 같은 느낌도 있어서 private 기본 생성자를 하는 것으로 충분하다고 생각한다.

profile
엘 프사이 콩그루

0개의 댓글