Item 87 - 커스텀 직렬화 형태를 고려하라
클래스가 Serializable을 구현하고 기본 직렬화 형태를 사용한다면 다음 릴리스 때 버리려 한 현재의 구현에 발이 묶이게 된다. 먼저 고민해보고 괜찮다고 판단될 때만 기본 직렬화 형태를 사용하라. 기본 직렬화 형태는 유연성, 성능, 정확성 측면에서 신중히 고민한 후 합당할 때만 사용해야 한다. 객체의 물리...
클래스가 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...
스택 추적(stack trace) 예외 객체의 toString 메서드를 호출해 얻은 문자열 일반적으로 예외 클래스 이름 뒤에 상세 메시지가 붙는 형태 프로그래머 혹은 신뢰성 엔지니어(Site Reliability Engineer, SRE)가 실패 원인을 분석하기 위한 유일한 정보인 경우가 많다. 실패를 재현하기 힘든 경우, 더 자...
메서드가 던지는 예외는 그 메서드를 올바로 사용하는데 아주 중요한 정보다. 따라서 각 메서드가 던지는 예외 하나하나를 문서화하는데 충분한 시간을 쏟아야한다. - item 56 검사 예외는 따로따로 선언하고, 반드시 문서화하자. 검사 예외는 항상 따로따로 선언하고, 각 예외가 발생하는 상황을 자바독의 @throws 태그를 사용하여 정확히 문...