반응형
- 자원을 직접 명시하지 말고 의존 객체 주입을 사용하자2021-03-15 11:59:44많은 클래스가 하나 이상의 자원에 의존하는데, 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식은 적합하지 않다.(final 한정자를 제거하고 다른 객체로 교체하는 메서드를 추가할 수 있지만, 오류를 내기 쉬우며 멀티스레트 환경에서 쓸 수 없다) 이런 클래스는 여러 자원 인스턴스를 지원해야 하며, 클라이언트가 원하는 자원을 사용해 한다. 이러한 방식을 만족하는 간단한 방식은 인스턴스 생성시 생성자에 필요한 자원을 넘겨주는 것이다. 이 방식은 자원이 몇 개든 의존 관계가 어떻든 상관없이 잘 동작하며, 불변을 보장하여 여러 클라이언트에서 의존 객체들을 안심하고 공유할 수 있다. 의존 객체 주입은 생성자,정적 팩터리, 빌더 모두에 똑같이 응용할 수 있다. 이 패턴의 쓸만한 변..
- 인스턴스화를 막으려거든 private 생성자를 사용하자2021-03-15 09:20:33남용하면 좋지 않지만 단순히 정적 메서드와 정적 필드만을 담은 클래스를 만들 수 있는데 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드를 모아 두거나 final 클래스를 상속해서 하위 클래스에서 메서드를 넣는 건 불가능하기 때문에 final 클래스와 관련한 메서드를 모아둘 수 있다. 이러한 유틸리티 클래스들은 인스턴스로 만들어 쓰려고 설계한 것이 아니다. 추상 클래스로 만든느 것은 인스턴스화를 막을 수가 없다 ( 하위 클래스를 만들어 인스턴스화 할 수 있기 때문에) 컴파일러가 명시된 생성자가 없을때 기본 생성자를 만들려고 하기 때문에 private 생성자를 명시적으로 추가하면 클래스의 인스턴스화를 막을 수 있다. public class Utility{ private Utility(){ throw..
- private 생성자나 열거 타입으로 싱글턴임을 보증하자2021-03-15 01:42:39싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 싱글턴의 전형적인 예로는 함수와 같은 무상태 객체나 설계상 유일해야 하는 시스템 컴포넌트를 들 수 있다. 클래스를 싱클턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다. 왜냐하면 테스트시 인스턴스를 mock 구현으로 대체할 수 없기 때문이다. 싱글턴을 만들시 생성자는 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마련해둔다. public static final 필드 방식의 싱글턴 ( reflection을 사용하면 private 생성자를 호출 할 수있다) 이 방식은 api에 싱글턴임이 명백히 들어나며, 간결하다 정적 팩터리 방식의 싱글턴( 항상 같은 객체의..
- 생성자에 매개변수가 많다면 빌더를 고려하라2021-03-15 00:54:38인스턴스 생성시 선택적 매개변수가 많다면 대응이 어렵다 점층적 생성자 패턴도 쓸 수는 있지만, 매개변수가 많아지면 클라이언트 코드를 작성하거나 읽기가 어려워진다. 자바 빈즈 패턴을 사용하면 객체 하나를 만들시 파라미터를 채울 여러 메서드를 호출해야 하고, 객체가 완전히 생성되기 전까지는 일관성이 무너진 상태에 놓이게 된다. 또한, 자바 빈즈 패턴에서는 클래스를 불변으로 만들 수가 없다. 이러한 대안으로 빌더 패턴이 있다. 빌더 패턴은 필수 매개변수만으로 생성자를 호출해 빌더 객체를 얻은 후 빌더 객체가 제공하는 일종의 세터 메서드로 원하는 선택 매개변수를 설정한 후 마지막으로 buil 메서드를 호출해 객체를 얻는 방식이다. 빌더는 생성할 클래스 안에 정적 멤버 클래스로 만들어두는 게 보통이다. 빌더 패턴..
반응형