본문 바로가기
Language/Effective java

객체 생성과 파괴

by y.j 2022. 6. 1.
728x90

인스턴스화를 막으려거든 private 생성자를 사용하라.

정적 메서드와 정적 필드만을 담은 클래스를 만들고 싶을 때 private 생성자를 사용해서 사용하지 않도록 명시하자.

public class UtilityClass {
    
    private UtilityClass() {
        throw new AssertionError()
    }
}

혹시나 내부에서 사용 할 수도 있기 때문에 AssertionError()를 던져주자.

 

장점

1. 상속을 막아준다.

2. 사용하지 말라는 표현이 명백하다.

 

자원을 직접 명시하지 말고 의존 객체 주입을 사용하라.

아래 코드들은 final로 인해 유연하지 못하다. 반드시 하나의 객체만을 사용한다는 가정이 없이는 사용하기 어렵고 final제거 한 후 교체하는 방식도 어색하며 오류를 내구 쉽다. 또한 멀티 스레드 환경에서 사용하기 어렵다.


정적 유틸리티를 잘못 사용한 예 - 유연하지 않고 테스트하기 어렵다.

public class SpellChecker {
    private static final Lexicon dictionary = ... ;

    private SpellChecker(...) {}

    public boolean isValid(String word) { ... }
    public List<String> suggestion(String typo) { ... }
}

싱글턴 패턴을 잘못 사용한 예 - 유연하지 않고 테스트하기 어렵다,

public class SpellChecker {
    private final Lexicon dictionary = ... ;
    
    private SpellChecker(...) {}
    
    public static SpellChecker INSTANCE = new SpellChecker(...);
    
    public boolean isValid(String word) { ... }
    public List<String> suggestion(String typo) { ... }
}

하지만, 의존 객체 주입을 사용하면 된다. 클래스가 어려 자원 인스턴스를 지원 할 수 있으며 클라리언트가 원하는 자원을 사용 할 수 있다.


객체 의존 방식

public class SpellChecker {
    private final Lexicon dictionary;
    
    public SpellChecker(Lexicon dictionary) {
        this.dictionary = Objects.requireNonNull(dictionary);
    }
    
    public boolean isValid(String word) { ... }
    private List<String> suggestions(String typo) { ... }
}

장점 

1. 자원이 몇 개든 의존 관계가 어떻든 상관없이 잘 돌아간다.

2. 불변을 보장하여 여러 클라이언트가 의존 객체들을 안심하고 공유 할 수 있다.

3. 생성자, 정적 팩터리, 빌더 모두에 똑같이 응용 할 수 있다.

4. 팩토리 메서드 패턴을 이용하면 특정 타입의 인스턴스를 반복해서 만들어준다.

 

 

728x90

'Language > Effective java' 카테고리의 다른 글

모든 객체의 공통 메서드  (0) 2022.06.06
객체 생성과 파괴  (0) 2022.06.05
객체 생성과 파괴  (0) 2022.06.01
객체 생성과 파괴  (0) 2022.05.22
객체 생성과 파괴  (0) 2022.05.09

댓글