개발 기록

[이펙티브 자바] 아이템 4,5 본문

JAVA

[이펙티브 자바] 아이템 4,5

수염차 2024. 9. 8. 00:24

(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) { ... }
}

장점 : 클래스의 유연성, 재사용성, 테스트 용이성(가짜 객체 주입 가능) 개선

 

* 변경 패턴 : 팩터리 메서드 패턴

객체를 생성할 때 어떤 클래스의 인스턴스를 만들 지 서브 클래스에서 결정하게 한다.

클래스의 인스턴스를 만드는 일을 서브클래스에게 맡기는 것

(찾아봐도 잘 이해가 안 가서 추가로 봐야할 듯 ,,)

 

Comments