Item 3 - private 생성자나 열거타입으로 싱글턴임을 보증하라
싱글턴(Singleton)이란? 인스턴스를 오직 하나만 생성할 수 있는 클래스 무상태 객체, 설계상 유일해야 하는 시스템 컴포넌트, DBCP(DataBase Connection Pool) 등 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워진다. 싱글턴 인스턴스를 가짜(mock) 구현으로 대체할...
싱글턴(Singleton)이란? 인스턴스를 오직 하나만 생성할 수 있는 클래스 무상태 객체, 설계상 유일해야 하는 시스템 컴포넌트, DBCP(DataBase Connection Pool) 등 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워진다. 싱글턴 인스턴스를 가짜(mock) 구현으로 대체할...
Item2 - 생성자에 매개변수가 많다면 빌더를 고려하라 정적 팩터리 메서드와 생성자는 선택적 매개변수가 많을 때 적절히 대응하기 어렵다. 🤦♀️ 이러한 제약의 대안으로 프로그래머들은 다음과 같은 방법을 사용했다. 점층적 생성자 패턴 자바 빈즈 패턴 빌더 패턴 (1) 점층적 생성자 패턴 (확장의 어려움) public c...
정적 팩터리 메서드의 장점 👍 (1) 이름을 가질 수 있다. 생성자에 넘기는 매개변수와 생성자 자체만으론 반환될 객체의 특성을 제대로 설명하지 못한다. 반면, 정적 팩터리 메서드는 이름만 잘 지으면 반환될 객체의 특성을 쉽게 묘사할 수 있다. [생성자] : BigInteger(int, int, Random) [정적 팩터리 메서드]...
Serializable을 구현하는 순간, 생성자 이외의 방법으로 인스턴스를 생성할 수 있게 된다. 이전 아이템에서도 계속 언급되지만, 버그와 보안 문제가 일어날 가능성이 커진다. 하지만 직렬화 프록시 패턴을 사용하면 이 위험을 크게 줄일 수 있다. 직렬화 프록시 패턴 public final class Period implements Serial...
싱글턴 패턴과 직렬화 진짜 싱글턴일까? ,,, No(🙅) public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } public void leaveTheBuilding() { ... } } 이 클래...
readObject 메서드 ObjectInputStream / ObjectOutputStream 를 통해 객체를 파일에 읽고 쓴다. 이 클래스에 포함된 메서드가 readObject() / writeObject()이다. 클래스에 readObject() / writeObject() 가 정의되어 있다면, 기본 직렬화 과정에서 이 메서드를 통해 ...
클래스가 Serializable을 구현하고 기본 직렬화 형태를 사용한다면 다음 릴리스 때 버리려 한 현재의 구현에 발이 묶이게 된다. 먼저 고민해보고 괜찮다고 판단될 때만 기본 직렬화 형태를 사용하라. 기본 직렬화 형태는 유연성, 성능, 정확성 측면에서 신중히 고민한 후 합당할 때만 사용해야 한다. 객체의 물리...
어떤 클래스의 인스턴스를 직렬화 가능하게 하려면 Serializable을 구현하면 된다. 👨💻 하지만, Serializable을 구현하면 릴리스한 뒤에는 수정하기 어렵다. 🤦♀️ 클래스가 Serializable을 구현하면 직렬화된 바이트 스트림 인코딩도 하나의 공개 API가 된다. 그래서 이 클래스가 널리 퍼지는...
직렬화 객체 직렬화 : 자바가 객체를 바이트 스트림으로 인코딩(직렬화)하고, 그 바이트 스트림으로부터 다시 객체를 재구성(역직렬화)하는 매커니즘이다. 직렬화된 객체는 다른 VM에 전송하거나 디스크에 저장한 후 필요할 때 역직렬화하여 사용할 수 있다. 자바의 직렬화 “자바의 직렬화는 위험하다.” 보이지 않는 생성자, API와 구...
이식성을 높이는 방법 정확성이나 성능이 스레드 스케줄러에 따라 달라지는 프로그램이라면 다른 플랫폼에 이식하기 어렵다. 🤦 (1) 실행 가능한 스레드의 평균적인 수를 프로세스 수보다 지나치게 많아지지 않도록 하라. 그래야 스케줄러가 고민할 거리가 줄어든다. 실행 준비가 된 스레드들은맡은 작업을 완료할 때까지 계속 실행되도록 만들어라...