JAVA/Effective Java 15

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

아이템5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라. 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스 나 싱글턴 방식 이 적합하지 않다. 그 이유는 우연하지 않고 테스트하기가 어렵기 때문. (= 많은 클래스가 하나 이상의 자원에 의존하는 클래스) 대신 클래스가 여러 자원 인스턴스를 지원해야 하며, 클라이언트가 원하는 자원을 사용해야 한다. 인스턴스를 생성할 때 생성자에게 필요한 자원을 넘겨주는 방식을 사용하면 된다 => "의존객체주입" //맞춤법 검사기 클래스 public class SpellChecker{ private final Lexicon dictionary; // 맞춤법 검사기의 경우, 언어별로 따로 있고 특수어휘용 사전 등 별도의 버전이 있기 때문에 // 아래..

JAVA/Effective Java 2022.05.21

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

아이템4. 인스턴스화를 막으려거든 private 생성자를 사용하라 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 게 아니다. 하지만 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어준다. 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없다. 컴파일러가 기본 생성자를 만드는 경우는 오직 명시된 생성자가 없을 뿐이니 private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다. //인스턴스를 만들 수 없는 유틸리티 클래스 public class UtilityClass{ //기본 생성자가 만들어지는 것을 막는다 (인스턴스화 방지용) private UtilityClass(){ throw new AssertionError(); } } 명시적 생성자가 private..

JAVA/Effective Java 2022.05.20

아이템3. private 생성자나 열거 타입으로 싱글턴임을 보증하라

아이템3. private생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴(Singleton) : 인스턴스를 오직 하나만 생성할 수 있는 클래스 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다. 싱글턴을 만드는 방식은 세가지가 있다. 1. public static final 필드 방식의 싱글턴 public class Elvis{ public static final Elvis INSTACNE = new Elvis(); private Elvis(){...} public void leaveTheBuilding(){...} } private 생성자는 pulic static final 필드인 Elvis.INSTANCE를 초기화할 때 딱 한번만 호출된다. public 이나 prot..

JAVA/Effective Java 2022.05.20

아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라

아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라 정적 팩터리와 생성자에 선택적 매개변수가 많을 때 1. 점층적 생성자 패턴 (telescoping constructor pattern) // 점층적 생성자 패턴 - 확장하기 어려움 public class NutritionFacts{ private final int servingSize; // (ml, 1회 제공량) 필수 private final int servings; // (회, 총 n회 제공량) 필수 private final int calories; // (1회 제공량당) 선택 private final int fat; // (g/1회 제공량) 선택 private fianl int sodium; // (mg/1회 제공량) 선택 private fina..

JAVA/Effective Java 2022.05.20

아이템1. 생성자 대신 정적팩터리 메서드를 고려하라.

아이템1. 생성자 대신 정적 팩터리 메서드를 고려하라. 클래스는 클라이언트에 public 생성자 대신 (혹은 생성자와 함께) 정적 팩터리 메서드를 제공할 수 있다. 정적 팩터리 메서드 (static factory method) : 클래스의 인스턴스를 반환하는 단순한 정적 메서드 (리턴값이 그 클래스의 인스턴스값인 메서드) // 정적 팩터리 메서드의 예시: 기본타입인 boolean 값을 받아 Boolean 객체 참조로 변환해준다 public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 팩터리 메서드가 생성자보다 좋은 점 (= 장점) 이름을 가질 수 있다. 생성자에 넘기는 매개변수와 생성자 자체만으로는 반환될 객..

JAVA/Effective Java 2022.05.20