객체 생성을 막기위해서는
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 인용.
'JAVA > Effective Java' 카테고리의 다른 글
객체의 생성과 삭제 - 규칙 7 종료자 사용을 피하라 (0) | 2018.05.29 |
---|---|
객체의 생성과 삭제 - 규칙 6 유효기간이 지난 객체 참조는 페기하라. (0) | 2018.05.29 |
객체의 생성과 삭제 - 규칙 5 불필요한 객체는 만들지 말라 (0) | 2018.05.29 |
객체의 생성과 삭제 - 규칙 3 private 생성자나 enum 자료형은 싱글톤 패턴을 따르도록 설계하라. (0) | 2018.05.29 |
객체의 생성과 삭제 - 규칙 2 생성자 인자가 많을 때는 Builder 패턴 적용을 고려하라 (0) | 2018.05.29 |