JAVA/Effective java
-
private 생성자로 noninstantiability를 강제할 것JAVA/Effective java 2020. 12. 30. 15:08
단순히 static 메서드와 static 필드를 모아두는 유틸리티 클래스들을 만들고 싶을 때가 있다. OOP적 사고와는 다소 거리가 있지만 나름의 쓰임새는 있다. Arrays에 배열 관련 메서드, Collections에 정적 메서드 와 팩토리 등이 그 예이다. 또한 final 클래스와 관련된 메서드들을 모아놓을 때도 사용하게 된다. final 클래스를 상속해서 하위 클래스에 메서드를 넣는 것은 불가능하기 때문이다. 따라서 이같은 유틸리티 클래스는 인스턴스를 만들어 쓰려고 설계한 게 아니다. 하지만 생성자를 명시하지 않으면 생성되는 기본 생성자는 public한 생성자이다. 클라이언트는 이 생성자가 자동 생성된 것인지 구분할 수 없다. 실제로 공개된 API들도 의도치 않게 인스턴스화할 수 있게 된 클래스가 ..
-
private 생성자 또는 enum 타입을 사용해서 싱글톤으로 만들 것JAVA/Effective java 2020. 12. 29. 19:35
싱글톤은 흔히 쓰는 용어이다. 하나의 패턴의 이름이고 App을 통틀어서 해당 클래스의 인스턴스가 하나만 사용하는 패턴을싱글톤이라고 한다. 간단하게 싱글톤 패턴을 요약해보면 자기 타입에 대한 인스턴스를 private static으로 만들어 놓는다. private 한 생성자를 만든다. 이제 이 타입의 인스턴스는 new를 통해 만들 수 없다. static 한 get메서드를 통해서 이 하나의 인스턴스를 가져다가 쓸 수 있다. ( multi-thread 등의 환경을 고려한다면 좀 더 복잡한 형태가 될 것 ) 이처럼 오직 한 인스턴스만 만드는 클래스를 싱글톤이라 부른다. 보통 함수 같은 Stateless 객체 또는 본질적으로 유일한 시스템 컴포넌트를 그렇게 만든다. 싱글톤의 단점으로는 사용하는 클라이언트 코드를 테..
-
생성자 매개변수가 많다면 빌더 사용을 고려해보자JAVA/Effective java 2020. 12. 28. 15:51
static 팩토리 메서드, public 생성자 모두 매개변수가 많이 필요한 경우 불편해진다. 그 예가 NutritionFacts인데 해당 클래스를 한번 봐보자. 몇몇 필드등은 반드시 세팅되어야 되는 필드고 나머지 필드는 Optional 한 필드들도 있다. 기본 타입은 기본값으로 세팅이 될 것이고 참조 타입은 null로 기본 세팅이 될 것이다. 하지만 문제는 굉장히 코드가 길어지고 특히 자바에서는 이것이 뭘 뜻하는지 알 수가 없게 된다. 따라서 이런 생성자를 쓰게 되면 필요 없는 매개변수도 넘겨야 하는 경우가 발생하는데 보통 0 같은 기본값을 넘기게 된다. 동작하기는 하지만 읽기가 어렵고 작성하기도 역시 번거롭다. 그렇다면 매개변수를 받지 않는 생성자를 만드는 건 어떨까? 비어있는 생성자와 세터를 사용해..
-
생성자 대신 static 팩토리 메소드 고려해보기JAVA/Effective java 2020. 2. 27. 16:15
클래스는 생성자와 별도로 정적 팩토리 메서드(static factory method)를 제공할 수 있다. 그 클래스의 인스턴스를 반환하는 단순한 정적 메서드 말이다. 클래스는 public 생성자 대신 정적 팩토리 메서드를 제공할 수 있다. 이 방식은 장단점이 존재한다. 장점 1. 이름을 가질 수 있다. 다음과 같이 생성자는 그 클래스와 동일한 이름으로만 만들어야 하지만 거기서 반환하는 객체를 잘 설명하지 못할 경우, 잘 만든 이름을 가진 static 팩토리를 사용하는 것이 보다 쉽고 읽기 편하다는 것. 또 똑같은 타입을 파라미터로 받는 생성자 2개를 만들 수 없는 경우 public static 팩토리 메서드를 사용하는 것이 유용하다. 2. 반드시 새로운 객체를 만들 필요가 없다. 불변 클래스인 경우나 매..