본문 바로가기

Language/Java Plus

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

 

 

요약

 

 

많은 클래스가 하나 이상의 자원에 의존하는 상황을 고려해보자

예를 들어, 맞춤법을 확인해주는 클래스는 여러가지 단어가 존재하고 언어가 여럿 존재하기에 하나의 인스턴스를 만들어 사용하는 정적 유틸리티 방식이나 싱글턴 방식을 사용하면 해당 경우에서 유연한 사용이 불가능하다.

 

예를 들어, 하나의 사전 인스턴스를 만들어놓고 이를 활용해 맞춤법을 확인해주는 클래스는 유연하지 못한 것이다.

즉, 사용하는 자원에 따라 동작이 달라지는 클래스는 정적 유틸리티 클래스나 싱글턴으로 사용하기에 적합하지 않다.

 

 

 

 

의존 객체 주입 방식

이러한 경우에는 해당 클래스(맞춤법 클래스)에 대한 인스턴스를 생성할 때, 생성자를 통해 필요한 자원(사전 클래스)를 넘겨주는 방법이 가장 적합하다.

 

public class spellChecker{

    private final Lexion dictionary;
    public spellChecker(Lexion dictionary){
    	this.dictionary = Objects.requireNotNull(dictionary);
    }   

}

 

 

장점

- 사용하고자 하는 자원이 많든 적든 동작이 잘 된다.

- 또한 불변을 보장하여 여러 클라이언트가 의존 객체들을 공유가 가능하다.

 

 

생성자에 자원 팩터리를 넘겨주는 방식

팩터리 : 호출할 때마다 특정타입의 인스턴스를 반복해서 만들어주는 객체, 팩터리 메서드 패턴을 구현, ex) Supplier<T> 인터페이스

Supplier<Lexion> dictionary = new Supplier<Lexion>() {
    @Override
    public Lexion get(){
    	return new englishDictionary;
    }
}

 

 

Supplier<T> 인터페이스

- 해당 인터페이스는 get메서드를 구현한 함수형 인터페이스이다.

- 주로, 매개변수를 받지않고 제네릭 타입 T의 값을 반환한다.

 

 

 

코드 정리

https://github.com/mokjaemin/EffectiveJAVA

 

GitHub - mokjaemin/EffectiveJAVA: Study Files Of Effective JAVA

Study Files Of Effective JAVA. Contribute to mokjaemin/EffectiveJAVA development by creating an account on GitHub.

github.com