생성자 대신 정적 팩터리 메서드를 고려하라
public 생성자보다 static 팩토리 메서드를 만들 수 있는지를 고려해라
상대적인 장단점이 있지만 , 정적 팩토리의 유리한 경우가 많으니 항상 고려해봐야한다
- 이름을 가질 수 있다.
- 호출될 때마다 인스턴스를 새로 생성하지 않을 수도 있다.
- 반환 타입의 하위 타입 객체를 반환할 수도 있다.
- 입력 매개변수에 따라 매번 다른 클래스의 객체를 반환할 수도 있다.
- 정적 팩터리 메서드를 작성하는 시점에는 반환할 객체의 클래스가 존재하지 않아도 된다
정적 팩토리 메소드 사용의 장점?
- 생성자의 이름을 가질 수 있다.
- 새로운 인스턴스를 생성하지 않고 사용 할 수 있다.
- 반환 타입에서 하위 객체를 반환 할 수 있다.
생성자에 매개변수가 많다면 빌더를 고려하라.
매개변수가 많다면 빌더 패턴을 고려하자
클라이언트 코드가 훨씬 간결해진다.
자바 빈즈 방법을 사용해 setter 를 사용하게 되면 setter 가 퍼블릭 이여서
불변성을 유지하기가 어려울수있다.
그에 비해 빌더는 초기에 한번만 set을 해주니 불변성을 갖추기 쉽다.
private 생성자나 열거 타입으로 싱글턴임을 보증하라
싱글턴을 만드는 방법들을 보자
첫번째 방식
두번째 방식
정적 팩토리 메소드 방식을 이용한 싱글턴 생성
하지만 첫번째 두번째 방식은 리플렉션 공격으로 private 생성자를 무시하고 만들수있다.
또한 역직렬화 시 새로운 인스턴스가 필요하다
Enum 타입으로 생성을 하면 간단하고
serialization 을 보장해주고 리플렉션 공격에도 안전하고
싱글톤 객체도 보장해준다.
인스턴스화를 막으려거든 private 생성자를 사용하라
유틸성 클래스는 객체를 생성해서 사용하지 않고 메소드를
static 으로 만들어서 사용을 하는데,
java 는 컴파일 할 때 자동적으로 public 생성자를 만들어서 default 생성자를 만들어버린다.
이건 사용자에게 객체를 만들 여지를 준다.
추상 클래스로 만들기에는 , 이걸 사용하려면 추상 클래스를 구현해서 사용해야 하나 하는 오해를 살 수 있다.
따라서 생성자를 private 으로 만들어서 사용하는게 좋다
자원을 직접 명시하지 말고, 의존 객체 주입을 사용하라.
클래스가 자원에 따라 다른 행동을 해야 한다면, 싱글톤이나 정적 유틸리티 클래스로 만드는건 좋지 않다.
대신 필요한 자원을 생성자에 넘겨줘서 넘겨진 자원에 맞게 생성하는게 좋다
불필요한 객체 생성을 피하라
쉬운 예로 new String("TEST") 보단 "TEST" 가 극단적으로 좋다
전자는 힙 영역에 올라가고 후자는 상수 풀에 올라가기 때문에
비슷한 이유로 new Boolean() 대신 Boolean.valueOf() 가 좋다
- 패턴 같은 비싼 객체는 캐싱해서 사용하는게 좋다
오토박싱
자동으로 타입을 변경해주지만, 아래 예제는 Long 객체를 계속 만들게 된다.
단순히 long 만 되도 성능 개선을 할 수 있다.
다 쓴 객체 참조를 해제하라
GC 가 회수 하지 않게 코드가 짜여진 경우가 있다.
사이즈는 감소 시키지만 값은 그대로 있어서 GC 가 회수를 하지 않는다.
명시적으로 null 을 넣어 GC 가 회수해 가도록 할 수 있다.
finalizer와 cleaner 사용을 피하라
언제 실행이 될 지도 모르고 성능도 안 좋다
try-finally 보다는 try-with-resources를 사용하라.
finally 를 사용하면 코드가 복잡해지고
finally 에서 예외가 발생 하면 새로운 예외가 덮어지는 경우가 생긴다.
try-with-resources 를 사용하면 자동으로 닫아진다.
'Java > 이펙티브 자바' 카테고리의 다른 글
이펙티브 자바 - 7장 람다와 스트림 (0) | 2020.12.29 |
---|---|
이펙티브 자바 - 6장 열거타입과 애너테이션 (0) | 2020.12.24 |
이펙티브 자바 - 5장 제네릭 (0) | 2020.12.23 |
이펙티브 자바 - 4장 클래스와 인터페이스 (0) | 2020.12.21 |
이펙티브 자바 - 3장 객체의 공통 메소드 (0) | 2020.12.21 |