본문 바로가기

자바33

Effective Java #04 객체 생성을 막을 때는 private 생성자를 사용하라 생성자를 생략하면 컴파일러는 자동으로 인자없는 public 기본 생성자를 만들어 버린다.사용자는 자동 생성자와 일반 생성자를 구별할 수 있는 방법이 없다.객체를 만들 수 없도록 하려고 클래스를 abstract로 선언해봤자 하위 클래스를 정의하는 순간 객체 생성이 가능해지며상속 받아 사용하는 것이 맞다고 생각 할 수도 있다. 이 경우 기본 생성자는 클래스에 생성자가 없을 때 생성되니, private 생성자를 클래스에 넣어 객체 생성을 방지해야 된다. 123456789//객체를 만들 수 없는 유틸리티 클래스public class UtilityClass{ //기본 생성자가 자동 생성되지 못하도록 하여 객체 생성 방지 private UtilityClass(){ throw new AssertionError(); .. 2016. 4. 13.
Effective Java #02 private 생성자나 enum 자료형은 싱글턴 패턴을 따르도록 설계하라. 싱글턴은 객체를 하나만 만들 수 있는 클래스를 뜻한다. JDK 1.5 이전에는 싱글턴을 구현하는 방법이 두 가지라고 한다. (현재 글을 쓰고 있는 시점에 JDK 버전은 1.8까지 나온 것 같다.) 1234567//public final 필드를 사용한 싱글턴public class Elvis{ public static final Elvis INSTANCE = new Elvis(); private Elvis() {...} public void leaveTheBuilding() { ...}}Colored by Color Scriptercs 123456789//정적 팩터리를 이용한 싱글턴public class Elvis{ private static final Elvis INSTANCE = new Elvis(); .. 2016. 4. 13.
Effective Java #02 생성자 인자가 많을 때는 Builder 패턴 적용을 고려하라. 책에 나온 예문을 추려보면 다음과 같다. 1회 제공 칼로리에 지방, 포화 지방, 트랜스 지방, 콜레스테롤, 나트륨 등이 있는데 이런 클래스에는 어떠한 생성자나 정적 팩터리 메서드가 적합할까? 보통 프로그래머들은 이런 상황에는 다음과 같은 점층적 생성자 패턴 패턴을 적용한다고 한다.점층적 생성자 패턴은 다음과 같다. 123456789101112131415161718192021222324252627282930313233343536373839public class NutritionFacts{ //자바에서 final은 변수면 C#으로는 readonly이며 //함수에 final을 사용할 경우 상속 시, override를 사용할 시 오류가 난다. private final int servingSize; //(mL) .. 2016. 4. 12.
Effective Java #01 생성자 대신 정적 팩터리 메서드를 사용할 수 없는지 생각해 보라 이제 책을 처음 넘겨보도록 했다. 첫 장은 클래스를 처음 생성할 때, 사용할 수 있는 생성자를 대신하여 정적 팩터리 메서드를 사용할 수 없는지 생각해보라는 것이었다. 이 문제가 나온 이유는 다음과 같다. 클래스를 객체로 생성할 때, 매개변수가 동일한 생성자는 하나만 구현할 수 있다.결국 클래스에 여러 생성자를 구현하기 위해서는 생성자의 매개변수 순서를 바꾸거나, 매개변수를 계속 추가하여야 하고 결국 나중에 사용하는 사람은생성자 중 어떤 것을 사용하여야 할 지 몰라 원하는 기능을 사용할 수 없기 때문이다. 장점으로는 다음과 같이 설명한다.1. 정적 팩터리 메서드는 이름을 가지고 있으므로 추상적으로 짓는다면 어떠한 기능을 하는지 알 수 있다.2. 생성자와는 달리 새로운 객체를 생성할 필요는 없다고 한다. (.. 2016. 4. 11.