본문 바로가기

이펙티브자바4

[이펙티브 자바]아이템4 인스턴스화를 막기 위해 private 생성자 사용하기 정적 메서드만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 클래스가 아니다. 따라서 인스턴스 생성을 방지하는 것이 좋다 생성자에 주석으로 인스턴스화가 불가능한 이유를 설명하는 것이 좋다. 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없다. abstract클래스는'이 클래스는 상속을 한 후에 사용하세요'라는 용도의 클래스로 오해를 할 가능성도 존재한다. 자바에서는 아무런 생성자도 설정하지 않는 경우, 자동적으로 기본 생성자가 설정된다. 따라서 UtilityClass (추상 클래스)도 기본 생성자가 생성된다. 처음에 사용할 때 인스턴스화를 안 하면 어떻게 사용하지? 문제점 클래스 내부에서는 생성자 호출이 가능하고, 인스턴스를 생성할 수 있다는 것이다 해결 public class Utilit.. 2023. 7. 13.
[이펙티브 자바]아이템3 private 생성자나 열거 타입으로 싱글턴임을 보증하라 싱글턴이란? 인스턴스를 오직 하나만 생성할 수 있는 클래스 싱글턴 사용 이유 한번의 객체 생성으로 재 사용이 가능하기 때문에 메모리 낭비를 방지할 수 있다. 또한 싱글톤으로 생성된 객체는 무조건 한번 생성으로 전역성을 띄기에 다른 객체와 공유가 용이하다. 싱글턴의 한계 **private 생성자를 가지고 있기 때문에 상속할 수 없다.**private 생성자는 오직 싱글톤 클래스 자신만이 자기 오브젝트를 만들도록 제한한다.문제는 private 생성자를 가진 클래스는 다른 생성자가 없다면 객체지향의 장점인 상속과 다형성 사용이 불가능하다는 점이다. **싱글턴은 테스트하기가 어렵다.**클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트 하기가 어려울 수 있다.만들어지는 방식이 제한적이기 떄문에 테스트에.. 2023. 7. 13.
[이펙티브 자바]아이템2 생성자에 매개변수가 많다면 빌더를 고려하라 생성자와 정적 팩터리는 매개변수가 많을 때 적절히 대응하기 어렵다. 매개변수가 많을 때 문제 순서가 바뀌게 된다면 컴파일러는 알아채지 못 한다. 매개 변수가 몇 개인지도 알아야 한다. 많은 선택적 매개변수를 처리하기 위해 아래 두 가지 패턴이 사용되었다. 점층적 생성자 패턴 자바빈즈 패턴 불변성 문제 또한 완전히 생성된 객체라고 하더라도 외부적으로 세터 메소드를 노출하고 있으므로, 불변함을 보장할 수 없게된다. 즉, 자바빈즈 패턴을 사용하면 클래스를 불변으로 만들 수 없다. 점층적 생성자 패턴의 안전성 + 자바빈즈 패턴의 가독성 ⇒ 빌더 패턴 빌더 패턴의 단점 빌더 패턴도 장점만 존재하지는 않다. 선택적 매개변수를 많이 받는 객체를 생성하기 위해서는 먼저 빌더 클래스부터 정의해야한다. 빌더의 생성비용이 .. 2023. 7. 13.
[이펙티브 자바]아이템1 생성자 대신 정적 팩터리 메소드 정적 팩터리 메서드 객체 생성 역할을 하는 클래스 메서드다. 장점 직관성 이름으로 객체의 특성을 직관적으로 설명한다. public static Position createStartPosition() { return new Position(START_POSITION_VALUE); } Position position = Position.createStartPosition(); 생성자는 똑같은 타입을 파라미터로 받는 생성자 두개를 만들 수 없는데, 정적 팩토리는 가능하다 public class Person { String name; String address; private Person() { } private Person(String name) { this.name = name; } public static.. 2023. 7. 13.