보통 유틸리티 클래스를 사용할 경우, 인스턴스화를 하지 않는다.
static 메서드를 사용할 경우, 인스턴스화를 사용하게 되면 오히려 이 메서드가 static 메서드인지, 인스턴스 메서드인지 판별하기 어렵기 때문에 좋지 않은 코드이다.
그래서 이 경우 private 생성자를 이용하여 인스턴스화를 막는다.
public abstract class UtilityClass {
public UtilityClass() {
}
}위와 같이 abstract를 사용할 경우 UtilityClass의 생성자를 사용할 순 없지만, 저 클래스를 상속받은 자식 클래스에서 인스턴스화 시킬 수 있다.
오히려 abstract 키워드 때문에 이 클래스가 상속해서 사용하는 클래스라고 착각하여 코드 해석에 어려움을 준다.
public class UtilityClass {
// 해당 생성자가 왜 private 인지(막아뒀는지) 이유를 설명
/**
* 이 클래스는 인스턴스를 만들 수 없습니다.
*/
private UtilityClass() {
// AssertionError()는 try-catch로 처리하라는 뜻이 아니라 해당 상황이 발생되면 안된다는 것을 나타낸다.
throw new AssertionError();
}
}ActiveProfilesUtils,AnnotationConfigUtils 등 private으로 생성자를 정의하지 않고, abstract로 만들어서 인스터스화를 막는다.
하지만 두 번째(추상 클래스로 만드는 것으로는 인스턴스화를 막을 수 없다.)와 같은 이유로 해당 방법은 좋지 못하다.