Может ли конструктор быть приватным? Чем полезен приватный конструктор?
Да, может. Я считаю, что это еще один пример того, как это полезно:
//... ErrorType.java
public enum ErrorType {
X,
Y,
Z
}
//... ErrorTypeException.java
import java.util.*;
import java.lang.*;
import java.io.*;
//Translates ErrorTypes only
abstract public class ErrorTypeException extends Exception {
private ErrorTypeException(){}
//I don't want to expose thse
static private class Xx extends ErrorTypeException {}
static private class Yx extends ErrorTypeException {}
static private class Zx extends ErrorTypeException {}
// Want translation without exposing underlying type
public static Exception from(ErrorType errorType) {
switch (errorType) {
case X:
return new Xx();
case Y:
return new Yx();
default:
return new Zx();
}
}
// Want to get hold of class without exposing underlying type
public static Class<? extends ErrorTypeException> toExceptionClass(ErrorType errorType) {
switch (errorType) {
case X:
return Xx.class;
case Y:
return Yx.class;
default:
return Zx.class;
}
}
}
В приведенном выше случае он предотвращает создание экземпляров абстрактного класса любым производным классом, кроме его статических внутренних классов. Абстрактные классы не могут быть финальными, но в этом случае закрытый конструктор делает его эффективным финальным для всех классов, которые не являются внутренними классами