728x90
static 메서드와 static 필드만을 담은 유틸리티 클래스는 객체 지향과 거리도 멀지만, 쓰임새가 있다. 하지만, 해당 클래스를 abstract로 만들어도, 상속 받아서 인스턴스를 만들 수 있기 때문에 인스턴스를 만드는 걸 막을 순 없다.
아무런 생성자를 만들지 않은 경우에도 컴파일러가 기본적으로 아무 인자가 없는public생성자를 만들어주기 때문에 그런 경우에도 인스턴스를 만들 수 있다.
따라서 인스턴스화를 막기 위해선 명시적으로private생성자를 추가해야 한다.
static method와 static field를 담은 유틸리티 클래스의 예시
java.lang.Math,java.util.Arrays,java.util.Collections특정 인터페이스를 구현하는 객체를 생성해주는 정적 메서드(혹은 팩터리) 모음
public final class MathUtilities {
public static double findMax(double a, double b) {
return (a > b) ? a : b;
}
public static double findMin(double a, double b) {
return (a < b) ? a : b;
}
public static double power(double base, double exponent) {
return Math.pow(base, exponent);
}
}
public final class CollectionUtilities {
public static <T> void sortList(List<T> list) {
Collections.sort(list);
}
public static <T> T findMax(List<T> list) {
return Collections.max(list);
}
public static <T> T findMin(List<T> list) {
return Collections.min(list);
}
}
final클래스와 관련한 메서드들의 모음(final클래스를 상속해 하위 클래스에 메서드를 넣는 건 불가능하기 때문)
public final class StringUtils {
public static boolean isNullOrEmpty(String str) {
return str == null || str.isEmpty();
}
public static String reverse(String str) {
return new StringBuilder(str).reverse().toString();
}
}
이와 같이 정적 멤버만 담은 유틸리티 클래스는 인스턴스로 만들어 쓰려고 설계한 게 아니다.
인스턴스화 막기
- 추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없다.
- 하위 클래스를 만들어 인스턴스화 하면 그만이다.
- 추상 클래스를 본 사용자도 상속해서 쓰라는 뜻으로 오해할 수 있다.
private 생성자를 추가하면 클래스의 인스턴스화를 막을 수 있다.
인스턴스를 만들 수 없는 유틸리티 클래스
public final class StringUtils {
private StringUtils() {
throw new AssertionError();
} // 인스턴스 생성 방지
public static boolean isNullOrEmpty(String str) {
return str == null || str.isEmpty();
}
public static String reverse(String str) {
return new StringBuilder(str).reverse().toString();
}
}
- 명시적 생성자가
private→ 클래스 바깥에서 접근할 수 없다.Assertion Error를 던져 클래스 안에서 실수로라도 생성자를 호출하지 않도록 해준다.이 코드는 어떤 환경에서도 클래스가 인스턴스화되는 것을 막아준다. - 상속을 불가능하게 하는 효과가 있다.
private으로 생성자를 선언했으니 하위 클래스가 상위 클래스의 생성자에 접근할 길이 막혀버린다.
728x90
'Programming Language > Java' 카테고리의 다른 글
| [이펙티브 자바]Item.06-불필요한 객체 생성을 피하라. (0) | 2024.04.06 |
|---|---|
| [이펙티브 자바]Item.05-자원을 직접 명시하지 말고 의존 객체 주입을 사용하라 (0) | 2024.04.05 |
| [이펙티브 자바]Item.03-private 생성자나 열거 타입으로 싱글턴임을 보증하라 (0) | 2024.04.02 |
| [이펙티브 자바]Item.02-생성자에 매개변수가 많다면 빌더를 고려하라 (0) | 2024.03.22 |
| [이펙티브 자바]Item.01-생성자 대신 정적 펙터리 메서드를 고려하라 (0) | 2024.03.15 |