개발 기록
[이펙티브 자바] 아이템 4,5 본문
(4) 인스턴스화를 막으려거든 private 생성자를 사용하라
정적 메서드와 정적 필드만을 담은 클래스는 인스턴스로 만들어 사용하려는 클래스가 아님.
- 생성자를 명시하지 않을 경우 컴파일러가 자동으로 기본 생성자를 만들어줌
- 이때는 private 생성자를 추가하면 클래스의 인스턴스화 막을 수 있음
public class UtilityClass {
// 인스턴스화 방지용
private Utilityclass() {
throw new AssertionError();
}
}
- 클래스 안에서 실수라도 생성자 호출을 막기위해 error 를 던져도 좋음
- 하지만 생성자를 호출하지 않는 코드라 한번에 이해가 어려우니 주석을 달자.
- 상속 불가능.
(5) 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라
클래스가 내부적으로 하나 이상의 자원에 의존하고, 그 자원이 클래스 동작에 영향을 줄 경우
싱글톤, 정적 유틸리티 클래스 ( 한 번 로드가 되면 수정이 불가능 ) 대신 의존 객체 주입 방식이 적절함.
-> 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식
public class Spellchecker {
private final Lexicon dictionary;
public Spellchecker(Lexicon dictionary) {
this.dictionary = Objects.requireNonNulKdictionary);
}
public boolean isValid(String word) { ... }
public List<String> suggestions(String typo) { ... }
}
장점 : 클래스의 유연성, 재사용성, 테스트 용이성(가짜 객체 주입 가능) 개선
* 변경 패턴 : 팩터리 메서드 패턴
객체를 생성할 때 어떤 클래스의 인스턴스를 만들 지 서브 클래스에서 결정하게 한다.
클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 것
(찾아봐도 잘 이해가 안 가서 추가로 봐야할 듯 ,,)
'JAVA' 카테고리의 다른 글
[이펙티브 자바] 아이템 7,8 (2) | 2024.10.03 |
---|---|
[이펙티브 자바] 아이템 6 (1) | 2024.10.03 |
[이펙티브 자바] 아이템3 (0) | 2024.09.07 |
IllegalArgumentException: Illegal base64 character 20 에서 20은!? (0) | 2024.09.02 |
[이펙티브 자바] 아이템2 (0) | 2024.08.31 |
Comments