-
아이템4. 인스턴스화를 막으려거든 private 생성자를 사용하라Java/이펙티브 자바 2022. 11. 1. 10:57
핵심정리
- 정적 메서드만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 클래스가 아니다
public class UtilityClass { public static String hello() { return "hello"; } public static void main(String[] args) { String hello = UtilityClass.hello(); // 인스턴스 불필요 UtilityClass utilityClass = new UtilityClass(); utilityClass.hello(); } }
- 추상 클래스로 만드는 것으로 완벽히 인스턴스화를 막을 수 없다
public abstract class UtilityClass { public UtilityClass() { System.out.println("Constructor"); } ... }
public class DefaultUtilityClass extends UtilityClass{ public static void main(String[] args) { DefaultUtilityClass utilityClass = new DefaultUtilityClass(); } }
ㆍ서브 클래스를 만들면 인스턴스를 만들 수 있게 된다. ( 자식 클래스 인스턴스를 만들때 상위 클래스 생성자를 호출 )
- private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다
public class UtilityClass { /** * 이 클래스는 인스턴스를 만들 수 없습니다. */ private UtilityClass() { // 내부에서는 호출 가능하므로 throw new AssertionError(); // 에러 처리 ( 생성자가 사용된다면 ) } ... }
- 생성자에 주석으로 인스턴스화 불가한 이유를 설명하는 것이 좋다
ㆍ'왜 못쓰는 코드를 만들었을까' 에 대한 해결
- 상속을 방지할 때도 같은 방법을 사용할 수 있다
'Java > 이펙티브 자바' 카테고리의 다른 글
아이템6. 불필요한 객체 생성을 피하라 (0) 2022.11.10 아이템5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) 2022.11.01 아이템3. 생성자나 열거 타입으로 싱글턴임을 보증하라 (0) 2022.10.31 아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라 (0) 2022.10.31 아이템1. 생성자 대신 정적 팩터리 메서드를 고려하라 (0) 2022.10.28