Effective Java 4

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

public class Utility{ //기본 생성자를 막기 위해 private 사용 private Utility(){ //기본생성자를 통한 객체 생성 방지를 위해 throw 발생 throw new Exception(); } } 명시적으로 만든 생성자가 private이기 때문에 클래스의 외부에서는 접근 불가능하다. 따라서 어떤 환경에서도 클래스가 인스턴스화 되는것을 막을 수 있다. throw new Exception처럼 예외를 발생시켜 직관적으로 명시해준다.

Effective Java 2023.04.27

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

싱글턴: 인스턴스를 오직 하나만 생성할 수 있는 클래스 주의점: 클래스를 싱글턴으로 만들게 되면 사용하는 클라이언트를 테스트하기가 어려워진다. ->MOCK객체를 만들 수 없기 때문에 ​ 1. public static final 방식의 싱글턴 public static final Elvis INSTANCE = new Elvis(); private Elvis(){...} 위 코드처럼 INSTANCE를 호출하게 되면 Elvis는 최초 한 번만 만들어진 이후에 쭉 재사용된다. ​ 장점: public static final 클래스이므로 맨 처음에 메모리가 올라오고 나서 변경이 불가능하니 명백히 싱글턴임이 드러난다. Elvis el = new Elvis(); //불가능 Elvis el1 = Elvis.INSTANCE..

Effective Java 2023.04.27

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

생성자와 정적팩터리의 공통적 제약: 선택적 매개변수가 많을 때 적절히 대응하기 어렵다. 매개변수가 많으면 코드를 읽을 때 각 값의 의미가 무엇인지 헷갈릴테고, 매변수가 몇개인지도 주의해서 세어보아야한다. 찾기 어려운 버그로 이어질 수도 있다. ​ 대안1. 점층적 생성자 패턴 매개변수 개수만큼 생성자를 늘리는 방식 NutritionFacts cocaCola = new NutritionFacts(240, 8, 100, 0, 35, 27); 사용자가 설정하길 원치않는 매개변수까지 어쩔 수 없이 값을 지정해야한다. 매개변수 조합에 따라 생성자 수가 쓸데없이 많이 늘어날 수 있다. 불변 클래스가 아니기 때문에 오류가 생길 가능성이 크고, 안전성이 낮다. ​ 대안2. 자바빈즈 패턴 매개변수가 없는 생성자로 객체를 ..

Effective Java 2023.04.27

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

생성자와 정적 팩터리 메소드의 공통적인 역할: 객체를 생성한다. ​ 1. 이름을 가질 수 있다. 객체는 생성 목적에 따라 사용할 필요가 있다. 생성자는 내부 구조를 잘 알고 있어야 목적에 맞게 객체를 생성할 수 있다. 하지만 정적팩터리 메서드를 사용하면 메서드 이름에 객체의 생성 목적을 담아낼 수 있다. -> 가독성이 좋아진다. //생성자 public BigInteger(int bitLength, int certainty, Random rnd){} //정적 팩터리 메소드 public static BigInteger probablePrime(int bitLength, Random rnd){} 정적 팩터리 메소드는 값이 소수인 BigInteger를 반환하는 메소드라고 알 수 있음. ​ 2. 호출할 때마다 새..

Effective Java 2023.04.27