JAVA/Effective Java

객체의 생성과 삭제 - 규칙 4 객체 생성을 막을 때는 private 생성자를 사용하라.

반응형

객체 생성을 막기위해서는 
Abstract Class 이용하거나생성자를 private 생성하면 막을  있다.
 
하지만 이렇게 객체 생성을 막는다는 것은 객체지향 개념에서 벗어나는 행위일  있다.
 
하지만 다음과 같은 경우에 사용을 위해서 사용되기도 한다.
 
1.  자바의 기본 자료형 (primitive value) 또는 배열에 적용되는 메서드를  군대에 모아둘  유용하다.
-> Util성 성질을 가지는 클래스에서 유용
Ex) java.lang.Math, java.lang.Arrays
Math.abs(), Math.cos()
Arrays.asList()

2. 규칙 1번에서 사용하는 정적 메서드를 모아놓을 때도 사용할 수 있다.
Ex) java.util.Collections
Collections.emptyList(); 
Collections.emptyMap();


3. final 클래스에 적용할 메서드들을 모아놓을 때도 활용할 수 있다.
-> 클래스에 final을 붙히면 더 이상 상속 구현이 불가능한 클래스이다.
-> 명확한 정의가 되지 않은 클래스가 상속이 가능한경우, 그 클래스를 상속한 자식클래스는 그 클래스가 변경될 때마다 정상적으로 동작하지 않을 위험이 있기 때문에 이런 클래스는 final로 상속이 불가능한 클래스로 구현한 후, 이 클래스를 사용하기 위해서는 팩토리 정적 메소드 패턴을 이용하게 하는 것이 좋다.


그럼 유틸성 클래스를 사용하기 위해서 객체 생성이 불가능하게
만들려고 할때 좋은 방법이 있을까?

생성자를 생략한다
- 생성자를 생략할 경우 컴파일러가 public 기본 생성자를 만들어 버린다. 그러므로 좋은 방법이 아니다.

abstract 클래스로 선언한다
- 해당 추상클래스를 상속받아서 객체로 만들 수 있기 때문에 좋지 않다. 

private 생성자를 클래스에 넣어서 객체 생성을 방지한다.
- 기본 생성자가 없을 경우에 기본 생성자를 컴파일러가 생성하니 private 생성자를 추가해 놓으면 객체 생성을 방지할 수 있다.
- private 생성자가 있는 클래스는 자식클래스를 가질 수 없기 때문에 하위클래스를 이용하여 객체를 생성하는 경우를 막을 수 있다.



1
2
3
4
5
6
7
Ex)
public class CommonUtil {
 private CommonUtil() {
  // 행여나 객체가 생성될 경우 에러를 던져서 그 행위를 방지한다.
  throw new AssertionError();
 }
}
cs





출처 : 조슈아 블로크, 『 Effective Java 2/E』, 이병준 옮김, 인사이트(2014.9.1), 규칙4 인용.



반응형