Book/Effective Java 3E
-
Item 5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라Book/Effective Java 3E 2022. 10. 10. 08:47
사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않습니다. 맞춤법 검사기 클래스(SpellChecker)는 여러 자원 인스턴스(언어별 사전 or 특수 어휘용 사전 등)를 지원해야 하며, 클라이언트가 원하는 자원(dictionary)을 사용해야 합니다. 이 조건을 만족하는 간단한 패턴이 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식입니다. 이는 의존 객체 주입의 한 형태로, 맞춤법 검사기를 생성할 때 의존 객체인 사전을 주입해주면 됩니다. // 의존 객체 주입은 유연성과 테스트 용이성을 높여줍니다. public class SpellChecker { private final Lexicon dictionary; public SpellChecker(Le..
-
Item 4. 인스턴스화를 막으려거든 private 생성자를 사용하라Book/Effective Java 3E 2022. 10. 7. 08:59
정적 메서드와 정적 필드만을 담은 클래스(java.lang.Math와 java.util.Arrays처럼 기본 타입 값이나 배열 관련 메서드들, java.util.Collections처럼 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드(혹은 팩터리), final 클래스와 관련한 메서드들을 모아놓을 때 사용)는 인스턴스로 만들어 쓰려고 설계한 게 아닙니다. 하지만 생성자를 명시하지 않으면 컴파일러가 자동으로 기본 생성자를 만들어줍니다. 즉, 매개변수를 받지 않는 public 생성자가 만들어집니다. private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있습니다. package effectivejava.chapter2.item4; // 코드 4-1 인스턴스를 만들 수 없는 유틸리티 클래스 pu..
-
Item 3. private 생성자나 열거 타입으로 싱글턴임을 보증하라Book/Effective Java 3E 2022. 10. 7. 08:39
싱글턴(singleton)이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말합니다.[Gamma95] 싱글턴의 전형적인 예로는 함수와 같은 무상태(stateless) 객체나 설계상 유일해야 하는 시스템 컴포넌트를 들 수 있습니다. 그런데 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있습니다. 싱글턴 생성 방식 1. final 필드 package effectivejava.chapter2.item3.field; // 코드 3-1 public static final 필드 방식의 싱글턴 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { } public void lea..
-
Item 2. 생성자에 매개변수가 많다면 빌더를 고려하라Book/Effective Java 3E 2022. 10. 3. 08:53
정적 팩터리와 생성자에는 선택적 매개변수가 많을 때 적절히 대응하기 어렵다는 제약사항이 있습니다. 대안 1. 점층적 생성자 패턴(telescoping constructor pattern) package effectivejava.chapter2.item2.telescopingconstructor; // 코드 2-1 점층적 생성자 패턴 - 확장하기 어렵다. public class NutritionFacts { private final int servingSize; // (mL, 1회 제공량) 필수 private final int servings; // (회, 총 n회 제공량) 필수 private final int calories; // (1회 제공량당) 선택 private final int fat; // (..
-
Item 1. 생성자 대신 정적 팩터리 메서드를 고려하라Book/Effective Java 3E 2022. 10. 2. 10:53
클래스는 생성자와 별도로 정적 팩터리 메서드(static factory method)를 제공할 수 있습니다. 그 클래스의 인스턴스를 반환하는 단순한 정적 메서드입니다. // 생성자 private final boolean value; public Boolean(boolean value) { this.value = value; } // 정적 팩터리 메서드 public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 장점 이름을 가질 수 있습니다. 정적 팩터리는 이름만 잘 지으면 반환될 객체의 특성을 쉽게 묘사할 수 있습니다. 예컨대 생성자인 BigInteger(int, int, Random)과 정적 팩터리 메서드인 ..