스터디/이펙티브자바

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

아이템 5 자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 사용하는 자원에 따라 동작이 달라지는 클래스에는 정적 유틸리티 클래스나 싱글턴 방식이 적합하지 않다. ... 이 조건을 만족하는 간단한 패턴이 있으니, 인스턴스를 생성할 때 생성자에 필요한 자원을 넘겨주는 방식이다. 직접 명시되어 고정되어 있는 변수는 테스트를 하기 힘들게 만든다. 즉, 의존성을 바깥으로 분리하여 외부로 부터 주입받도록 작성하여야 한다. (의존 객체 주입 패턴) Example code public class PriceCalculateService { private static final String EXCHANGE_URL = "https://somewhere.com"; private static final double FIX..

2020.01.18 게시됨

스터디/이펙티브자바

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

아이템 4 인스턴스화를 막으려거든 private 생성자를 사용하라 private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다. case 정적 메서드와 정적 필드만을 담은 클래스를 만들경우 (ex. 유틸성 클래스) java.lang.Math java.util.Arrays Java.util.Collections final 클래스와 관련한 메서드를 모아 놓을 때 추상 클래스로 만드는 것은 상속을 하라는 의미로 받아 들여질 수 있으므로 인스턴스화를 막는데 아무런 도움이 되지 못한다. 기본적으로 아무런 생성자를 만들어 놓지 않으면 컴파일러가 기본 생성자를 public하게 만들기 때문에 명시적으로 private한 생성자를 만들어두어 인스턴스화를 막을 필요가 있다. 그렇지 않으면 기본 생성자를 컴파일러가 만..

2020.01.18 게시됨

스터디/이펙티브자바

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

아이템 3 private 생성자나 열거타입으로 싱글턴임을 보증하라 p.23 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다. 타입을 인터페이스로 정의한 다음 그 인터페이스를 구현해서 만든 싱글턴이 아니라면 mock 구현으로 대체할 수 없기 때문이다. 인터페이스 없이 구현한 싱글턴 코드 public class Validator { private static final Validator INSTANCE = new Validator(); public static final Validator getInstance() { return INSTANCE; } private int bound; private Validator() { this.bound = 10; } public vo..

2020.01.17 게시됨

스터디/이펙티브자바

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

[아이템2] 생성자에 매개변수가 많다면 빌더를 고려하라 점층적 생성자 패턴 매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵다. public class Gradation { private String name; private int number; private long money; private double temperature; public Gradation(String name, int number, long money, double temperature) { this.name = name; this.number = number; this.money = money; this.temperature = temperature; } public Gradation(String name, int ..

2020.01.16 게시됨

스터디/이펙티브자바

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

이펙티브 자바 2장 객체 생성과 파괴 [아이템1] 생성자 대신 정적 팩터리 메서드를 고려하라 첫번째 장점, 이름을 가질 수 있다. Example code. public class Ladder { public static Ladder left() { return new Ladder(Direction.LEFT); } public static Ladder right() { return new Ladder(Direction.RIGHT); } public static Ladder down() { return new Ladder(Direction.DOWN); } private Direction direction; public Ladder(Direction direction) { this.direction = dir..

2020.01.15 게시됨