독서/Effective Java
-
Item 5: Prefer dependency injection to hardwiring resources독서/Effective Java 2021. 12. 4. 19:48
맞춤법 검사기는 사전을 사용해 해당 맞춤법이 올바른지를 체크한다. 정적 유틸리티 클래스(Item 4)로 생성한다면 다음과 같다. // Inappropriate use of static utility - inflexible & untestable! public class SpellChecker { private static final Lexicon dictionary = ...; private SpellChecker() {} // Noninstantiable public static boolean isValid(String word) { ... } public static List suggestions(String typo) { ... } } 싱글턴으로 구현한다면?(Item 3) // Inappropria..
-
Item 4: Enforce noninstantiability with a private constructor독서/Effective Java 2021. 12. 4. 19:48
Private 생성자로 비인스턴스화를 강제하자. 정적 메서드와 정적 필드만을 담은 유틸리티 클래스는 객체 지향과 거리도 멀지만 유효성 체크, 패턴 매칭, UUID 검증 등 쓰임새가 있다. 정적 메서드와 정적 필드만을 담은 클래스의 예시 java.lang.Math, java.util.Arrays java.util.Collections 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드(혹은 팩터리) 모음 final 클래스와 관련한 메서드들의 모음 (final 클래스를 상속해 하위 클래스에 메서드를 넣는 건 불가능하기 때문) 이와 같이 정적 멤버, 메소드만 존재하는 클래스의 경우 인스턴스화해서 사용하는 것이 아닌, 변하지 않고 사용되는 공용 클래스로 사용된다. 하지만, 생성자를 명시하지 않으면 컴파일러..
-
Item 3: Enforce the singleton property with a private constructor or an enum type독서/Effective Java 2021. 12. 4. 19:48
private 생성자나 열거 타입으로 싱글턴임을 보증하자 싱글톤? 정확히 한 번 인스턴스화되는 클래스 일반적으로 함수(Item 24)와 같은 상태 비저장 개체, 본질적으로 고유한 시스템 구성 요소를 의미함. 단점 클래스를 싱글톤으로 만들면 해당 유형의 역할을 하는 인터페이스를 구현하지 않는 한 싱글톤에 대한 Mocking을 대체하는 것이 불가능하고, 이 때문에 클라이언트를 테스트하기 어렵다. 싱글톤을 구현하는 두 가지 일반적인 방법 1. public static final 필드 변수 제공 public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } public void leaveTheBuildin..
-
Item 2: Consider a builder when faced with many constructor parameters독서/Effective Java 2021. 12. 4. 18:36
시작 영양 성분 표시를 자동으로 저장하는 서비스를 제공한다고 가정해보자. 먼저, 영양 성분 표시를 위한 데이터 클래스를 만들 것이다. 기획자가 샘플을 보여줬는데 샘플에는 다음과 같은 필드들이 존재했다. 1회 제공량, 용기당 1회 제공량, 1회 제공량당 칼로리 - 필수 필드 총 지방, 포화 지방, 트랜스 지방, 콜레스테롤, 나트륨 + 20개 이상의 필드 - 선택적(Optional) 필드, 기본값은 0 이제 기본적인 클래스를 만들었다. public class NutritionFacts { private final int servingSize; // (mL) required private final int servings; // (per container) required private final int ca..
-
Item 1. Consider static factory methods instead of constructors독서/Effective Java 2021. 12. 4. 18:21
인스턴스를 생성하는 다양한 방법들 생성자 사용 빌더 사용(추후 아이템에 나온다.) 정적 팩토리 메서드 사용 정적 팩토리 메서드란? 해당 클래스의 인스턴스를 반환하는 메소드라고 보면 된다. Ex) boolean(primitive) 타입 -> Boolean(Object) 타입으로 변환 public static Boolean valueOf(boolean b) { return b ? Boolean.TRUE : Boolean.FALSE; } 정적 팩토리 메소드 != 팩토리 메소드 패턴 정적 팩토리 메서드는 디자인 패턴에 직접적으로 대응되는 것이 없다. 정적 팩토리 메소드를 사용했을 때 생성자보다 나은 장점들 (1) 이름을 가질 수 있다. 생성자에 대한 parameter가 그 자체로 반환되는 객체를 설명하지 않는 ..