생성자 대신 정적 패터리 메서드를 고려하라 클래스의 인스턴스를 얻는 전통적인 수단은 public생서자다 클래스는 생성자와 별도로 정적 팩터리 메서드를 제공할수 있다 정적 팩터리 메서드가 생성자 보다 좋은점 1. 이름을 가질수있다 2. 호출될때마다 인스턴스를 새로
정적팩터리와 생성자에는 똑같은 제약이있는데선택적매개변수가 많을때 적절한 대응이 힘들다이러한 경우 프로그래머들은 점층적 생성자패턴을 즐겨사용했다하지만 점층적 생성자 패턴은 확장하기가 어렵고,매개변수 개수가 많아지면 클라이언트 코드를 작성하거나 읽기가 어렵다자바빈즈패턴도
싱글턴이란 인스턴스를 오직 하나만 생성할수있는 클래스를 의미한다.싱글턴의 예로는 무상태(stateless)객체나 설계상 유일해야하는 시스템 컴포넌트를 들수있다1\. public static final 필드 방식의 싱글턴private생성자는 final 필드인 인스턴스를
인스턴스화를 막으려거든 private생성자를 사용하라 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한것이 아님. 생성자를 명시하지않으면 public생성자가 만들어지고, 사용자는 이 생성자가 자동생성된것인지 구분하기가 어렵다 추상클래스로 만드는것으
자원을직접 명시하지 말고 의존객체주입을 사용하라많은클래스가 하나 이상의 자원에의존정적유틸리티를 잘못 사용한 예시싱글턴을 잘못 사용한 예사용하는자원에따라 동작이 달라지는 클래스에는 정적유틸리티 클래스나 싱글턴 방식이 적합하지않다인스터스를 생성할때 생성자에 필요한 자원을
불필요한 객체 생성을 피하라1.똑같은기능의객체를 매번생성하기보단 객체 하나를 재사용하는 편이나을때가많음재사용은 빠르고 세련되기때문, 특히 불변객체는 언제든 재사용가능다음예시는 하지말아야할 극단적예시실핼될때마다 인스턴스를 새로만들기때문에 완전히 쓸데없는 행위해당 코드가
finalizer와 cleaner사용을 피하라 1.finalizer는 예측할수없고 상황에따라 위험할수있어 불필요하다 2.cleaner는 finalizer보다는 덜 위험하지만 예측할수없고 느리고 일반적으불필요 3.finalizer와 cleaner는 제때실행되어야하는
close메서드를 통해 직접 닫아줘야 하는 자원이많다자원닫기는 클라이언트가 놓치기 쉬워서 예측할수없는 성능 문제로 이어지기도한다.상당수가 finalizer를 활용하고있지만 적절한 방법은 아니다1.자원을 회수하는 최선책- try-with-resources1)try-wit
재정의하지 않는것이 최선인 상황1.각 인스턴스가 본질적으로 고유하다2.인스턴스의 논리적 동치성을 검사할 일이없다.3.상위 클래스에서 재정의한 equals가 하위클래스에도 딱 들어맞는다.4.클래스가 private이거나 package-private이고 메서드를 호출할 일이
equals를 재정의하려거든 hashCode도 재정의하라1.hashCode재정의를 잘못했을때 문제되는부분\-->논리적으로 같은 객체는 같은 해시코드를 반환해야한다이코드 다음에 get메서드를 실행하면 null을 반환PhoneNumber클래스는 hashCode를 재정의하지
모든 하위클래스에서 메서드를 재정의1.toString을 잘 구현한 클래스는 사용하기에 훨씬 즐겁고, 해당 클래스를 사용한 시스템은 디버깅이 쉽다\-->객체를 참조하는 컴포넌트가 오류메시지를 로깅할때 자동으로 호출가능\-->재정의하지않으면 쓸모없는 메세지만 로그에 남을것
clone 재정의는 주의해서 진행하라 Cloneable인터페이스 1)복제해도 되는 클래스임을 명시하는 용도 2)clone메서드가 선언된 곳이 Clonable이 아닌Object 1.실무에서 Clonable을 구현한 클래스는 clone메서드를 public으로 제공, 사
상속보다는 컴포지션을 사용하라 1.메서드 호출과 달리 상속은 캡슐화를 깨뜨린다. =>상위클래스가 어떻게 구현되느냐에따라 하위클래스의 동작에 이상이 생길수 있음. 상속의잘못된 예 getAddCount메서드를 호출하면 3을 반환하리라 기대하지만 실제로는 6을 반환한다
상속보다는 컴포지션을 사용하라 1.메서드 호출과 달리 상속은 캡슐화를 깨뜨린다. =>상위클래스가 어떻게 구현되느냐에따라 하위클래스의 동작에 이상이 생길수 있음. 상속의잘못된 예 getAddCount메서드를 호출하면 3을 반환하리라 기대하지만 실제로는 6을 반환한다
상속을 고려한 설계화,문서화란?1.상속용 클래스는 재정의할수있는 메서드들을 내부적으로 어떻게 이용하는지 문서로 남겨야한다.\->재정의 가능 메서드를 호출할수있는 모든상황을 문서로 남겨야한다.주어진 원소가 이 컬렉션아에 있다면 그 인스턴스를 하나 제거한다이컬렉션안에 Ob
인터페이스자신을 구현한 클래스의 인스턴스를 참조할수있는 타입역할이 지침에 맞지않는 예로 상수 인터페이스가 있음메서드 없이 상수를 뜻하는 static final로만 가득찬 인터페이스를 의미잘못된 예상수인터페이스 안티패턴클래스내부에서 사용하는 상수는 외부 인터페이스가 아닌
태그 달린 클래스보다는 클래스 계층 구조를 활용하라 태그 클래스 -두가지 이상의 의미를 표현할수있으며 그중 현재 표현하는 의미를 태그값으로 알려주는 클래스 태그 클래스의 예시 태그 달린 클래스의 단점? 1) 열거타입 선언, 태그 필드,Switch문등 쓸데없는 코드
1)다른클래스 안에 정의된 클래스2)바깥클래스에서만 쓰여야함3)종류: 정적멤버, (비정적)멤버, 익명,지역 클래스정적맴버 클래스를 제외한 나머지 클래스는 내부클래스 이다. 1.정적 멤버클래스 •클래스 내부에 static으로 선언된 클래스 •다른클래스안에 선언되고,바깥클
톱 레벨 클래스는 한 파일에 하나만 담으라•소스파일 하나에 톱레벨 클래스를 여러개 선언하더라고 자바컴파일러는 불평하지않지만 아무런 득이없고 심각한 위험감수를 해야함•한클래스를 여러가지로 정의->어느것을 사용할지는 어느소스파일을먼저 컴파일 하느냐에따라 달라진다예시집기(U
제네릭은 불공변:함께 변하지않는다런타임실패컴파일 실패배열은 자신이 담기로한 원소의 타입을 인지하고 확인Long타입 배열에 String타입 데이터를 입력하면 ArrayStoreException이 발생반면, 리스트는 타입 정보가 런타임에는 소거된다.이런 이유로 배열은 제네
Object기반의 스택은 제네릭 타입이 필요해당 클래스는 제네릭 타입이어야한다클라이언트가 스택에서꺼낸 객체를 형본환 -> 런타임 오류가 날 위험이있음Object를 적절한 타입매개변수로 바꿔보면?아이템28에서 설명한것처럼 E와 같은 실체화 불가타입으로배열을 만들수없다두가
클래스와 마찬가지로 메서드도 제네릭으로 만들수있다 매개변수화 타입을 받는 정적 유틸리티 메서드는 보통 제네릭 Collections의 알고리즘 메서드는 모두 제네릭 컴파일은 되지만 경고가 발생한 경우? 1)메서드 타입을 안전하게 만들어야한다. ->메서드 선언에서의 세
한정적 와일드카드를 사용해 API유연성을 높이라 매개변수화 타입은 불공변 와일드카드 타입을 사용하지 않은 메서드- 결함이있음 이 메서드는 깨끗하지만 컴파일이 완벽하지않다. src원소 타입이 스택의 원소타입과 일치하면 동작 여기서 Stack
가변인수:메서드에 넘기는 인수의 개수를 클라이언트가 조절할수있게 해준다.가변인수 메서드를 호출하면 가변인수를 담기위한 배열이 생성됨\->varags 매개변수에 제네릭이나 변수화 타입이포함될시 컴파일 경고 발생1.매개변수화 타입의 변수가 타입이 다른객체를 참조하면 힙 오
제네릭은 Set< E >, Map<K, V>등의 컬렉션과 ThreadLocal< T >, AtomicReference< T > 등 단일원소 컨테이너에서도 쓰인다매개변수화 되는 대상은 컨테이너 자신이다.예로 Set에는 원소의 타입을 뜻하는 하나의 매
일정개수의 상수값을 정의한 다음 그외의값은 허용하지 않는 타입정수열거타입에는 단점이 존재•타입안전을 보장할수없으며 표현력이 좋지않음•정수 열거 패턴을 사용한 프로그램은 깨지기 쉬움정수 상수는 문자열로 출력하기가 다소 까다로움열거패턴의 단점을 깔끔히 씻어주는 동시에 여러
ordinal 메서드 대신 인스턴스 필드를 사용하라 대부분의 열거 타입 상수는 자연스럽게 하나의 정수값에 대응 모든 열거타입은 해당 상수가* 그 열거 타입에서 몇번째 위치인지를 반환하는 ordinal메서드* 제공 ordinal을 잘못 사용한 예 상수선언 순서를 바
비트별OR을 사용해 여러 상수를 하나의 집합으로 모을수있으며이렇게 만들어진 집합 비트필드라고 함•비트별 연산을 통해 합집합,교집합 같은 집합 연산을 효율적으로 수행•비트필드 값이 그대로 출력되면 단순한 정수 열거 상수를 출력할때 보다 해석이 어려움•최대 몇비트가 필요한
\->자바에서 함수타입을 표현할때 추상 메서드를 담은 인터페이스의 인스턴스익명클래스의 인스턴스를 함수객체로 사용하는것은 낡은 기법코드가 너무길기때문에 적합하지않음함수형 인터페이스라 불리는 인터페이스-> 람다식을 사용해 만들수있게됨람다식을 함수 객체로 사용한 예시 코드타
자바에서 함수 객체를 람다보다 더 간결하게 만드는 방법임의의 키와 Integer값의 매핑을 관리하는 프로그램의 일부Map에 추가된 merge메서드 사용merge메서드는 키, 값, 함수를 인수로 받으며 주어진 키가 맵안에 아직없다면 주어진 {키,값} 쌍을 그대로 저장람다
스트림에서는 부작용없는 함수를 사용하라 스트림 패러다임의 핵심 >일련의 변환으로 재구성 하는 부분 이때 각 변환 단계는 가능한 한 이전 단계의 결과를 받아 처리하는 순수함수여야함. -> 순수함수란? 오직 입력만이 결과에 영향을 주는 함수를 말함 스트림 패러다임을이
•원소 시퀀스, 일련의원소를 반환하는 메서드는 수없이 많지만 기본은 컬렉션 인터페이스이다.•원소 시퀀스를 반환할때는 스트림을 사용한다는 이야기가 많지만스트림은 반복을 지원하지 않음•스트림과 반복을 알맞게 조합해야 좋은 코드가 나온다.자바 타입 추론의 한계로 컴파일되지
•메서드와 생성자 대부분은 입력 매개변수의 값이 특정 조건을 만족하기를 바람.•인덱스값은 음수이면 안되며, 객체 참조는 null이 아니어야 한다.메서드 몸체가 실행되기전에 매개변수를 확인한다면 잘못된 값이 넘어왔을때 즉각적이고 깔끔한 방식으로 예외를 던질수 있다.pub