본문 바로가기
  • soobinhand의 기술 블로그
728x90

도서/이펙티브 자바 - Joshua Bloch12

아이템 4 - 인스턴스화를 막으려거든 private 생성자를 사용하라. 하위 클래스를 만들어 인스턴스화하면 그만이기 때문에 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없다. 컴파일러가 기본 생성자를 만드는 경우는 오직 명시된 생성자가 없을 때 뿐이니 private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다. 이렇게 하면 하위 클래스가 상위 클래스의 생성자에 접근할 길이 막혀버린다. 관련 코드 https://github.com/Soobinhand/effective_java/tree/master/src/Item_4 GitHub - Soobinhand/effective_java: 이펙티브 자바 이펙티브 자바. Contribute to Soobinhand/effective_java development by creating an account on GitHub... 2022. 1. 26.
아이템 3 - private 생성자나 열거 타입으로 싱글턴임을 보증하라. 싱글턴이란 인스턴스를 오직 하나만 생성할 수 있는 클래스를 말한다. 클래스를 싱글턴으로 만들면 이를 사용하는 클라이언트를 테스트하기가 어려워질 수 있다. 싱글턴을 만드는 방식은 보통 둘 중 하나다. 두 방식 모두 생성자는 private으로 감춰두고, 유일한 인스턴스에 접근할 수 있는 수단으로 public static 멤버를 하나 마련한다. 가장 바람직한 방법은 열거 타입 방식의 싱글턴이다. public 필드 방식과 비슷하지만, 더 간결하고, 추가 노력 없이 직렬화가 가능하고 심지어 아주 복잡한 직렬화 상황이나 리플렉션 공격에서도 제2의 인스턴스가 생기는 일을 완벽히 막아준다. 대부분 상황에서는 원소가 하나뿐인 열거 타입이 싱글턴을 만드는 가장 좋은 방법이다. 관련 코드 https://github.com/.. 2022. 1. 25.
아이템 2 - 생성자에 매개변수가 많다면 빌더를 고려하라. 정적 메소드와 생성자는 선택적 매개변수가 많을 경우 적절히 대응하기 어렵다. 점층적 생성자 패턴도 쓸 수는 있지만, 매개변수 갯수가 많아지면 클라이언트 코드를 작성하거나 읽기 어렵다. 매개변수가 많을 때 활용할 수 있는 두 번째 대안은 자바빈즈 패턴이다. 매개변수가 없는 생성자로 객체를 만든 후, 세터 메서드들을 호출해 원하는 매개변수의 값을 설정하는 방식이다. 점층적 생성자 패턴의 단점들이 자바빈즈 패턴에서는 더 이상 보이지 않는다. 코드가 길어지긴 했지만 인스턴스를 만들기 쉽고, 그 결과 더 읽기 쉬운 코드가 되었다. 하지만 자바빈즈는 심각한 단점이 있음. 자바빈즈 패턴에서는 객체 하나를 만들려면 메서드를 여러 개 호출해야 하고, 객체가 완전히 생성되기 전까지는 일관성이 무너진 상태에 놓이게 된다. .. 2022. 1. 25.
아이템 1 - 생성자 대신 정적 팩토리 메소드를 고려하라. 클라이언트가 클래스의 인스턴스를 얻는 전통적인 수단은 public 생성자다. 하지만 다른 이유로 생성자보다는 정적 메소드를 사용하는 경우가 좋을 때가 있다. 물론 단점도 있음. 암튼 장단점을 알아보자. 우선 장점이다. 첫 번째 장점 : 이름을 가질 수 있다. 우선 생성자는 반환될 객체의 특성을 아주 제대로 설명하지 못할 수도 있다. 반면 정적 메소드는 이름만 잘 지으면 반환될 객체의 특성을 쉽게 묘사할 수 있다. 생성자의 매개변수들의 형식들을 바꿔가며 추가하는 것은 그렇게 좋은 생각이 아니다. 왜냐하면 아무리 기억력이 좋다한들, 모든 생성자를 외울 수 없기 때문이다. 하지만 이름을 가질 수 있는 정적 메소드에는 이런 제약이 없다. 한 클래스에 시그니처가 같은 생성자가 여러 개 필요할 것 같으면, 생성자를.. 2022. 1. 24.
728x90