Java/이펙티브 자바
-
아이템5. 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라Java/이펙티브 자바 2022. 11. 1. 13:47
핵심정리 : 자원을 직접 명시하지말고 의존 객체 주입을 사용하라 - 사용하는 자원에 따라 동작이 달라지는 클래스는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다 - 의존 객체 주입이란 인스턴스를 생성할 때 필요한 자원을 넘겨주는 방식이다 - 이 방식의 변형으로 생성자에 자원 팩터리를 넘겨줄 수 있다 - 의존 객체 주입을 사용하면 클래스의 유연성, 재사용성, 테스트 용이성을 개선할 수 있다. public interface Dictionary { boolean contains(String word); List closeWordsTo(String type); } public class SpellChecker { //private static final Dictionary dictionary = new D..
-
아이템4. 인스턴스화를 막으려거든 private 생성자를 사용하라Java/이펙티브 자바 2022. 11. 1. 10:57
핵심정리 - 정적 메서드만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 클래스가 아니다 public class UtilityClass { public static String hello() { return "hello"; } public static void main(String[] args) { String hello = UtilityClass.hello(); // 인스턴스 불필요 UtilityClass utilityClass = new UtilityClass(); utilityClass.hello(); } } - 추상 클래스로 만드는 것으로 완벽히 인스턴스화를 막을 수 없다 public abstract class UtilityClass { public UtilityClass() { Syst..
-
아이템3. 생성자나 열거 타입으로 싱글턴임을 보증하라Java/이펙티브 자바 2022. 10. 31. 16:50
첫번째 방법 : private 생성자 + public static final 필드 - 장점 : 간결하고 싱글턴임을 API에 들어낼 수 있다. 단점 1. 싱글톤을 사용하는 클라이언트 테스트하기 어려워진다. ㆍ하지만 인터페이스를 만든다면 Mock를 만들어서 테스트 가능 public interface IElvis { void leaveTheBuilding(); void sing(); } public class MockElvis implements IElvis{ @Override public void leaveTheBuilding() { } @Override public void sing() { System.out.println("You ain't nothin' but a hound dog."); } } @Te..
-
아이템2. 생성자에 매개변수가 많다면 빌더를 고려하라Java/이펙티브 자바 2022. 10. 31. 13:45
아이템2. 핵심정리1 - 생성자 체이닝과 자바빈즈 정적 팩터리와 생성자에 선택적 매개변수가 많을 때 고려할 수 있는 방안 - 대안1 : 점층적 생성자 패턴 또는 생성자 체이닝 ㆍ매개변수가 늘어나면 클라이언트 코드를 작성하거나 읽기 어렵다 ㆍ해당 값이 무엇인지, 전달 파라미터가 무엇인지 알기 힘들다 // 점층적 생성자 패턴 - 확장하기 어렵다! public class NutritionFacts { private final int servingSize; private final int servings; private final int calories; private final int fat; private final int sodium; private final int carbohydrate; public ..
-
아이템1. 생성자 대신 정적 팩터리 메서드를 고려하라Java/이펙티브 자바 2022. 10. 28. 10:47
장점 - 이름을 가질 수 있다. ( 동일한 시그니처의 생성자를 두개 가질 수 없다.) - 호출될 떄마다 인스턴트를 새로 생성하지 않아도 된다. (Boolean.valueOf) - 반환 타입의 하위 타입 객체를 반환할 수 있는 능력이 있다. ( 인터페이스 기반 프레임워크, 인터페이스에 정적 메소드 ) - 입력 매개 변수가 따라 매번 다른 클래스의 객체를 반환할 수 있다. (EnumSet) - 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다. ( 서비스 제공자 프레임워크 ) 단점 - 상속을 하려면 public이나 protected 생성하기 필요하니 정적 팩토리 메서드만 제공 - 정적 팩터리 메서드는 프로그래머가 찾기 힘들다. // 잘못된 예시 public class Ord..
-
자바 이펙티브 - 1. 들어가기Java/이펙티브 자바 2022. 6. 10. 15:53
명료성( clarity ) 과 단순성( simplicity ) - 컴포넌트는 사용자를 놀라게 하는 동작을 해서는 절대 안된다 ( 정해진 동작이나 예측할 수 있는 동작만 수행해야 한다 ) - 컴포넌트는 가능한 한 작되, 그렇다고 너무 작아서는 안된다 ( 이 책에서 컴포넌트란 개별 메서드부터 여러 패키지로 이뤄진 복잡한 프레임워크까지 재사용 가능한 모든 소프트웨어 요소를 뜻한다 ) - 코드는 복사되는 게 아니라 재사용되어야 한다. - 컴포넌트 사이의 의존성은 최소로 유지해야한다. - 오류는 만들어지자마자 가능한 한 빨리 (되도록 컴파일 타임에) 잡아야 한다. 자바가 지원하는 타입 1. 인터페이스 ( interface ) 2. 클래스 ( class ) 3. 배열 ( array ) 4. 기본 타입 ( primi..