-
[이펙티브 자바] 인스턴스화(객체화)를 막으려거든 private 생성자를 사용하라_아이템4이펙티브 자바 2023. 11. 21. 14:46
[인스턴스화(객체화)를 막으려면 private 생성자를 사용하라]
정적 메서드와 정적 필드만 담은 클래스를 만들고싶을 때(객체지향적으로 사고하지않는 방식) java.lang.Math와 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메서드들을 모아놓을 수 있다. java.util.Collections처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아놓을 수 있다. 그리고 final클래스와 관련한 메서드를 모아놓을 때 사용한다. => final class로 선언되면 상속받을 수 없기 때문에 내부의 모든 method는 overridding(재정의)될 수 없다.
유틸리티 클래스(인스턴스 메서드, 인스턴스 변수를 제공하지 않고 정적 메서드와 변수만 제공하는 클래스이다. 비슷한 기능의 메서드와 상수를 모아서 캡슐화하는 것)는 인스턴스로 만들어 쓰려고 설계한 것이 아니다. 생성자를 명시하지않으면 컴파일러가 자동으로 기본 생성자를 만들어준다. => 매개변수를 받지 않는 public 생성자가 만들어지며, 사용자는 이 생성자가 자동 생성된것인지 구분할 수 없다. 실제로 공개된 API들도 의도치 않게 인스턴스화할 수 있게된 클래스를 종종 볼 수 있다.
추상클래스로 만드는 것으로 인스턴스화를 막을 수 없다. => 하위 클래스를 만들어 인스턴스화하면 그만이다.(상속해서 사용하라는 뜻X) 컴파일러가 기본 생성자를 만드는 경우는 오직 명시된 생성자가 없을 때뿐이니 private생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다.[유틸리티 클래스 예제]
public class UtilityClass{ //기본 생성자가 만들어지는 것을 막는다(인스턴스화 방지용) private UtilityClass(){ throw new AssertionError(); } }
명시적 생성자가 private이니 클래스 바깥에서 접근할 수 없다. 꼭 AssertionError를 던질 필요는 없지만 클래스 안에서 실수로라도 생성자를 호출하지않도록 해준다. => 이 코드는 어떤 환경에서도 클래스가 인스턴스화되는 것을 막아준다.
하지만 생성자가 분명 존재하는데 호출할 수 없게 만들어 놓으니 직관적이지 않기 때문에 적절한 주석을 달아놓는다. 이 방식은 상속을 불가능하게 하는 효과도 있다. 모든 생성자는 묵시적으로 상위 클래스의 생성자를 호출하게 되는 데 이를 private으로 선언하여 하위 클래스가 상위클래스의 생성자 접근할 길이 막힌다.'이펙티브 자바' 카테고리의 다른 글
[이펙티브 자바]불필요한 객체 생성을 피하라 _아이템6 (0) 2023.11.27 [이펙티브 자바] 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라_아이템5 (0) 2023.11.23 [이펙티브 자바] private 생성자나 열거타입으로 싱글턴임을 보증하라_아이템3 (0) 2023.11.15 [이펙티브 자바] 생성자에 매개변수가 많다면 빌더를 고려하라_아이템2 (0) 2023.11.06 [이펙티브 자바] 객체 생성과 파괴_아이템1 (0) 2023.09.01