-
Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라백수의 개발/이펙티브 자바 2019. 7. 14. 16:34
단순히 정적 메서드와 정적 필드만을 담은 클래스를 만든다면, 사실상 해당 객체의 인스턴스화를 목적으로 만든 것이 아닐 것이다.
그렇기 때문에 별도로 객체의 인스턴스화를 막아준다.
이는 객체 지향적으로 좋지 않은 클래스라고 여기는 경향이 있지만, 이도 나름 쓰임새는 있다.
객체 인스턴스화 막기
대표적으로 이러한 객체는 java.lang.Math, java.util.Arrays, java.util.Collections 등이 있다.
이 객체들은 인스턴스화를 막았기 때문에 아래와 같이 코드를 작성할 수 없다.
Math mathObject = new Math(); Arrays arraysObject = new Arrays(); Collections collectionsObject = new Collection();
그렇다면 어떻게 객체의 인스턴스화를 막을 수 있을까?
간단하게 public 생성자를 private 생성자로 설정해주어 막을 수 있다.
public class UtilityClass{ // 기본 생성자가 만들어지는 것을 막는다(인스턴스화 방지용). private UtilityClass(){ throw new AssertionError(); } ... }
위에서 처럼 꼭 AssertionError를 발생시킬 필요는 없지만, 클래스 안에서 실수로라도 생성자를 호출하는 것을 방지해줄 수 있다.
이와 별도로 추상클래스를 통해 인스턴스화를 막을 수 있기는 하다.
그러나 추상클래스는 상속을 위한 클래스이기 때문에 상속하라는 뜻으로 받아들여지기 쉽다.
그래서 추상클래스를 통해 인스턴스화를 막더라도 단순히 하위 클래스를 만들어 인스턴스화가 가능하기 때문에 크게 의미가 없다.
abstract class AbstractUtils{ ... } class InstanceUtils extends AbstractUtils{ ... } AbstractUtils abstractUtils = new AbstractUtils(); // 인스턴스화 불가(컴파일 에러) InstanceUtils instanceUtils = new InstanceUtils(); // 인스턴스화 가능
마무리
인스턴스화를 막기위해 생성자를 private으로 작성해주면 된다.
그러나 이러한 경우 생성자가 private이기 때문에 상속이 불가능하다는 것을 명심하자.
'백수의 개발 > 이펙티브 자바' 카테고리의 다른 글
Item 6. 불필요한 객체 생성을 피하라 (2) 2019.07.16 Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) 2019.07.15 Item 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라 (0) 2019.07.13 Item 2. 생성자에 매개변수가 많다면 빌더를 고려하라 (0) 2019.07.09 Item 1. 생성자 대신 정적 팩터리 메서드를 고려하라 (0) 2019.07.03