해당 부분은 책의 순서와 관계없이 이해한 내용을 정리하였다.
인스턴스화를 막기위해 private 생성자를 사용하라는 부분인데, 인스턴스화를 사용하지 않는 경우는 유틸리티 클래스의 경우가 있다. 따라서 static 키워드가 사용되는 경우와 생각되는 문제점과 해결책을 정리하였다.
java.lang.Math/ java.util.Arrays 클래스처럼 산술에 필요한 기본 타입 값이나 배열관련된 사용
public final class Math {
/**
* Don't let anyone instantiate this class.
*/
private Math() {}
public static final double E = 2.7182818284590452354;
public static final double PI = 3.14159265358979323846;
}
Math 구현된 부분을 보면 산술시 고정된 값이 필요한 경우 static을 사용한다.
public class Collections {
// Suppresses default constructor, ensuring non-instantiability.
private Collections() {
}
private static final int BINARYSEARCH_THRESHOLD = 5000;
private static final int REVERSE_THRESHOLD = 18;
private static final int SHUFFLE_THRESHOLD = 5;
@SuppressWarnings("unchecked")
public static <T extends Comparable<? super T>> void sort(List<T> list) {
list.sort(null);
}
public static <T> void sort(List<T> list, Comparator<? super T> c) {
list.sort(c);
}
private static <T>
int indexedBinarySearch(List<? extends Comparable<? super T>> list, T key) {
// 생략
return -(low + 1); // key not found
}
java.util.Collections 클래스를 보면 특정 인터페이스를 구현하는 객체를 생성해주는 정적 메소드이 모여있는 것을 알 수 있다.
final클래스는 상속이 불가능하기 때문에 메소드를 모아 놓는데 사용될 수 있다.
인스턴스가 무의미하지만, 컴파일러가 자동으로 디폴트생성자를 생성한다. 사용자 입장에서 큰 의미가 없지만 Java Doc에 나타나므로 인스턴스 생성이 가능한 클래스로 생각할 수 있다. 따라서 이를 방지하는 것이 필요하다.
Effective Java