Item 89 - 인스턴스 수를 통제해야 한다면 readResolve 보다는 열거 타입을 사용하라
싱글턴 패턴과 직렬화 진짜 싱글턴일까? ,,, No(🙅) public class Elvis { public static final Elvis INSTANCE = new Elvis(); private Elvis() { ... } public void leaveTheBuilding() { ... } } 이 클래...
싱글턴 패턴과 직렬화 진짜 싱글턴일까? ,,, 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) 실행 가능한 스레드의 평균적인 수를 프로세스 수보다 지나치게 많아지지 않도록 하라. 그래야 스케줄러가 고민할 거리가 줄어든다. 실행 준비가 된 스레드들은맡은 작업을 완료할 때까지 계속 실행되도록 만들어라...
지연 초기화 (lazy initialization) 🐢 필드의 초기화 시점을 그 값이 처음 필요할 때까지 늦추는 기법 정적 필드와 인스턴스 필드에 모두 사용가능 주로 최적화 용도로 쓰이지만, 클래스와 인스턴스 초기화 때 발생하는 위험한 순환 문제를 해결하는 효과도 있다. 지연 초기화는 필요할 때까지는 하지 말라 🙅 클래스나 인...
여러 스레드가 하나의 메서드를 동시에 호출할 때 그 메서드가 어떻게 동작하느냐는 클라이언트와 클래스 간의 중요한 계약과도 같다. 만약 API 문서에 아무런 언급이 없다면 사용자는 나름의 가정을 하고 사용해야 한다. 만약 이 가정이 틀린다면 프로그램은 심각한 오류로 이어질 수 있다. 😰 API 문서에 synchronized 한정자 synchro...
🙇♀️ API 설계자가 메서드 선언에 예외를 명시하는 까닭은, 해당 메서드를 사용할 때 적절한 조치를 취해달라고 말하는 것이다. 예외를 무시하는 방법 😒 // catch 블록을 비워두면 예외가 무시된다. 아주 의심스러운 코드다! try { // ... } catch (SomeException e) { } 해당 메서드 호출을 tr...
실패 원자성(Failure Atomicity) 호출된 메소드가 실패하더라도 해당 객체는 메서드 호출 전 상태를 유지해야 한다. 위와 같은 특성을 실패 원자성이라고 한다. 실패 원자성은 시스템의 안정성, 성능, 신뢰성을 향상시키는데 필수적이다. 메서드 실패 원자적으로 만드는 방법 방법 1 : 불변 객체로 설계하기 - item17...