추천서문 v
저자서문 vii
역자서문 xi
CHAPTER 1 개요 1
CHAPTER 2 객체의 생성과 소멸목 차
7
[항목 1] 생성자 대신 static 팩토리(factory) 메소드 사용을 고려하자 7
[항목 2] 생성자의 매개변수가 많을 때는 빌더(builder)를 고려하자 15
[항목 3] private 생성자나 enum 타입을 사용해서 싱글톤의 특성을 유지하자 24
[항목 4] private 생성자를 사용해서 인스턴스 생성을 못하게 하자 27
[항목 5] 불필요한 객체의 생성을 피하자 29
[항목 6] 쓸모 없는 객체 참조를 제거하자 35
[항목 7] 파이널라이저(finalizer)의 사용을 피하자 40
CHAPTER 3 모든 객체에 공통적인 메소드 47
[항목 8] equals 메소드를 오버라이딩 할 때는 보편적 계약을 따르자 48
[항목 9] equals 메소드를 오버라이드 할 때는 hashCode 메소드도 항상 같이 오버라이드 하자 65
[항목 10] toString 메소드는 항상 오버라이드 하자 73
[항목 11] clone 메소드는 신중하게 오버라이드 하자 76
[항목 12] Comparable 인터페이스의 구현을 고려하자 88
CHAPTER 4 클래스와 인터페이스 95
[항목 13] 클래스와 그 멤버의 접근성을 최소화하자 95
[항목 14] public 클래스에서는 public 필드가 아닌 접근자(accessor) 메소드를 사용한다 100
[항목 15] 가변성을 최소화 하자 103
[항목 16] 가급적 상속(inheritance)보다는 컴포지션(composition)을 사용하자 112
[항목 17] 상속을 위한 설계와 문서화를 하자. 그렇지 않다면 상속의 사용을 금지시킨다 120
[항목 18] 추상 클래스보다는 인터페이스를 사용하자목 차
127
[항목 19] 타입을 정의할 때만 인터페이스를 사용하자 134
[항목 20] 태그(tagged) 클래스보다는 클래스 계층을 사용하자 137
[항목 21] 전략을 표현할 때 함수 객체를 사용하자 141
[항목 22] static 멤버 클래스를 많이 사용하자 145
CHAPTER 5 제네릭(Generics) 149
[항목 23] 새로 작성하는 코드에서는 원천(raw) 타입을 사용하지 말자 149
[항목 24] 컴파일 경고 메시지가 없게 하자 158
[항목 25] 배열보다는 List를 사용하자 162
[항목 26] 제네릭 타입을 애용하자 169
[항목 27] 제네릭 메소드를 애용하자 176
[항목 28] 바운드 와일드 카드를 사용해서 API의 유연성을 높이자 183
[항목 29] 타입 안전이 보장되는 혼성(heterogeneous) 컨테이너의 사용을 고려하자 193
CHAPTER 6 열거형(Enum)과 주석(Annotation) 201
[항목 30] int 상수 대신 enum을 사용하자 201
[항목 31] 서수(序數) 대신 인스턴스 필드를 사용하자 215
[항목 32] 비트(bit) 필드 대신 EnumSet을 사용하자 217
[항목 33] 서수(序數) 인덱스 대신 EnumMap을 사용하자 220
[항목 34] 인터페이스를 사용해서 확장 가능한 enum을 만들자 225
[항목 35] 작명 패턴보다는 주석(annotation)을 사용하자 230
[항목 36] Override 주석을 일관성 있게 사용하자 239
[항목 37] 타입 정의는 표시 인터페이스를 사용하자 243
CHAPTER 7 메소드(method) 247
[항목 38] 매개 변수가 유효한지 검사하자 247
[항목 39] 필요하면 방어 복사본을 만들자 251
[항목 40] 메소드 시그니처를 신중하게 설계하자 257
[항목 41] 오버로딩(overloading)을 분별력 있게 사용하자 260
[항목 42] 가변 인자(varargs)를 분별력 있게 사용하자 268
[항목 43] null대신 비어있는 배열이나 컬렉션을 반환하자 274
[항목 44] 외부에 제공하는 모든 API 요소에 대해 문서화 주석을 넣자 277
CHAPTER 8 프로그래밍 일반 285
[항목 45] 지역 변수의 유효 범위를 최소화 하자 285
[항목 46] 종전의 for 루프보다는 for-each 루프를 사용하자 289
[항목 47] 라이브러리를 배우고 사용하자 293
[항목 48] 정확한 계산에는 float나 double 타입을 쓰지 말자 297
[항목 49] 박스화 기본형보다는 기본형을 사용하자 300
[항목 50] 다른 타입을 쓸 수 있는 곳에서는 String 사용을 피하자 304
[항목 51] 문자열 결합의 성능 저하를 주의하자 308
[항목 52] 객체 참조는 그 객체의 인터페이스 타입으로 하자 310
[항목 53] 리플렉션보다는 인터페이스를 사용하자 313
[항목 54] 네이티브 메소드를 분별력 있게 사용하자 317
[항목 55] 잘 판단해서 최적화하자 319
[항목 56] 보편화된 작명 규칙을 따르자 323
CHAPTER 9 예외(Exceptions) 327
[항목 57] 예외 상황에서만 예외를 사용하자 327
[항목 58] 복구 가능 상황에는 checked 예외를 사용하고 런타임 예외는 프로그램 에러에 사용하자 331
[항목 59] checked 예외의 불필요한 사용을 피하자 334
[항목 60] 표준 예외를 사용하자 337
[항목 61] 하위 계층의 예외 처리를 신중하게 하자 340
[항목 62] 메소드가 던지는 모든 예외를 문서화하자 344
[항목 63] 실패 상황 정보를 상세 메시지에 포함하자 346
[항목 64] 실패 원자성을 갖도록 노력하자 349
[항목 65] 예외를 묵살하지 말자 351
CHAPTER 10 동시성(Concurrency) 353
[항목 66] 공유하는 가변 데이터에 접근 시 동기화하자 353
[항목 67] 지나친 동기화는 피하자 361
[항목 68] 스레드 그룹보다는 실행자와 작업을 사용하자 369
[항목 69] wait와 notify 대신 동시성 유틸리티를 사용하자 372
[항목 70] 스레드 안전을 문서화 하자 379
[항목 71] 늦 초기화를 분별력 있게 사용하자 383
[항목 72] 스레드 스케줄러에 의존하지 말자 387
[항목 73] 스레드 그룹을 사용하지 말자 390
CHAPTER 11 직렬화(Serialization) 393
[항목 74] Serializable 인터페이스를 분별력 있게 구현하자 393
[항목 75] 독자적인 직렬화 형태의 사용을 고려하자 400
[항목 76] 방어 가능한 readObject 메소드를 작성하자 408
[항목 77] 인스턴스 제어에는 readResolve 메소드보다 enum 타입을 사용하자 416
[항목 78] 직렬화된 인스턴스 대신 직렬화 프록시의 사용을 고려하자 422
번역 용어 목록 427
부록:제1판과의 항목 대비 441
참고문헌 445
찾아보기 451
저자서문 vii
역자서문 xi
CHAPTER 1 개요 1
CHAPTER 2 객체의 생성과 소멸목 차
7
[항목 1] 생성자 대신 static 팩토리(factory) 메소드 사용을 고려하자 7
[항목 2] 생성자의 매개변수가 많을 때는 빌더(builder)를 고려하자 15
[항목 3] private 생성자나 enum 타입을 사용해서 싱글톤의 특성을 유지하자 24
[항목 4] private 생성자를 사용해서 인스턴스 생성을 못하게 하자 27
[항목 5] 불필요한 객체의 생성을 피하자 29
[항목 6] 쓸모 없는 객체 참조를 제거하자 35
[항목 7] 파이널라이저(finalizer)의 사용을 피하자 40
CHAPTER 3 모든 객체에 공통적인 메소드 47
[항목 8] equals 메소드를 오버라이딩 할 때는 보편적 계약을 따르자 48
[항목 9] equals 메소드를 오버라이드 할 때는 hashCode 메소드도 항상 같이 오버라이드 하자 65
[항목 10] toString 메소드는 항상 오버라이드 하자 73
[항목 11] clone 메소드는 신중하게 오버라이드 하자 76
[항목 12] Comparable 인터페이스의 구현을 고려하자 88
CHAPTER 4 클래스와 인터페이스 95
[항목 13] 클래스와 그 멤버의 접근성을 최소화하자 95
[항목 14] public 클래스에서는 public 필드가 아닌 접근자(accessor) 메소드를 사용한다 100
[항목 15] 가변성을 최소화 하자 103
[항목 16] 가급적 상속(inheritance)보다는 컴포지션(composition)을 사용하자 112
[항목 17] 상속을 위한 설계와 문서화를 하자. 그렇지 않다면 상속의 사용을 금지시킨다 120
[항목 18] 추상 클래스보다는 인터페이스를 사용하자목 차
127
[항목 19] 타입을 정의할 때만 인터페이스를 사용하자 134
[항목 20] 태그(tagged) 클래스보다는 클래스 계층을 사용하자 137
[항목 21] 전략을 표현할 때 함수 객체를 사용하자 141
[항목 22] static 멤버 클래스를 많이 사용하자 145
CHAPTER 5 제네릭(Generics) 149
[항목 23] 새로 작성하는 코드에서는 원천(raw) 타입을 사용하지 말자 149
[항목 24] 컴파일 경고 메시지가 없게 하자 158
[항목 25] 배열보다는 List를 사용하자 162
[항목 26] 제네릭 타입을 애용하자 169
[항목 27] 제네릭 메소드를 애용하자 176
[항목 28] 바운드 와일드 카드를 사용해서 API의 유연성을 높이자 183
[항목 29] 타입 안전이 보장되는 혼성(heterogeneous) 컨테이너의 사용을 고려하자 193
CHAPTER 6 열거형(Enum)과 주석(Annotation) 201
[항목 30] int 상수 대신 enum을 사용하자 201
[항목 31] 서수(序數) 대신 인스턴스 필드를 사용하자 215
[항목 32] 비트(bit) 필드 대신 EnumSet을 사용하자 217
[항목 33] 서수(序數) 인덱스 대신 EnumMap을 사용하자 220
[항목 34] 인터페이스를 사용해서 확장 가능한 enum을 만들자 225
[항목 35] 작명 패턴보다는 주석(annotation)을 사용하자 230
[항목 36] Override 주석을 일관성 있게 사용하자 239
[항목 37] 타입 정의는 표시 인터페이스를 사용하자 243
CHAPTER 7 메소드(method) 247
[항목 38] 매개 변수가 유효한지 검사하자 247
[항목 39] 필요하면 방어 복사본을 만들자 251
[항목 40] 메소드 시그니처를 신중하게 설계하자 257
[항목 41] 오버로딩(overloading)을 분별력 있게 사용하자 260
[항목 42] 가변 인자(varargs)를 분별력 있게 사용하자 268
[항목 43] null대신 비어있는 배열이나 컬렉션을 반환하자 274
[항목 44] 외부에 제공하는 모든 API 요소에 대해 문서화 주석을 넣자 277
CHAPTER 8 프로그래밍 일반 285
[항목 45] 지역 변수의 유효 범위를 최소화 하자 285
[항목 46] 종전의 for 루프보다는 for-each 루프를 사용하자 289
[항목 47] 라이브러리를 배우고 사용하자 293
[항목 48] 정확한 계산에는 float나 double 타입을 쓰지 말자 297
[항목 49] 박스화 기본형보다는 기본형을 사용하자 300
[항목 50] 다른 타입을 쓸 수 있는 곳에서는 String 사용을 피하자 304
[항목 51] 문자열 결합의 성능 저하를 주의하자 308
[항목 52] 객체 참조는 그 객체의 인터페이스 타입으로 하자 310
[항목 53] 리플렉션보다는 인터페이스를 사용하자 313
[항목 54] 네이티브 메소드를 분별력 있게 사용하자 317
[항목 55] 잘 판단해서 최적화하자 319
[항목 56] 보편화된 작명 규칙을 따르자 323
CHAPTER 9 예외(Exceptions) 327
[항목 57] 예외 상황에서만 예외를 사용하자 327
[항목 58] 복구 가능 상황에는 checked 예외를 사용하고 런타임 예외는 프로그램 에러에 사용하자 331
[항목 59] checked 예외의 불필요한 사용을 피하자 334
[항목 60] 표준 예외를 사용하자 337
[항목 61] 하위 계층의 예외 처리를 신중하게 하자 340
[항목 62] 메소드가 던지는 모든 예외를 문서화하자 344
[항목 63] 실패 상황 정보를 상세 메시지에 포함하자 346
[항목 64] 실패 원자성을 갖도록 노력하자 349
[항목 65] 예외를 묵살하지 말자 351
CHAPTER 10 동시성(Concurrency) 353
[항목 66] 공유하는 가변 데이터에 접근 시 동기화하자 353
[항목 67] 지나친 동기화는 피하자 361
[항목 68] 스레드 그룹보다는 실행자와 작업을 사용하자 369
[항목 69] wait와 notify 대신 동시성 유틸리티를 사용하자 372
[항목 70] 스레드 안전을 문서화 하자 379
[항목 71] 늦 초기화를 분별력 있게 사용하자 383
[항목 72] 스레드 스케줄러에 의존하지 말자 387
[항목 73] 스레드 그룹을 사용하지 말자 390
CHAPTER 11 직렬화(Serialization) 393
[항목 74] Serializable 인터페이스를 분별력 있게 구현하자 393
[항목 75] 독자적인 직렬화 형태의 사용을 고려하자 400
[항목 76] 방어 가능한 readObject 메소드를 작성하자 408
[항목 77] 인스턴스 제어에는 readResolve 메소드보다 enum 타입을 사용하자 416
[항목 78] 직렬화된 인스턴스 대신 직렬화 프록시의 사용을 고려하자 422
번역 용어 목록 427
부록:제1판과의 항목 대비 441
참고문헌 445
찾아보기 451