Может ли конструктор в Java быть закрытым? - PullRequest
210 голосов
/ 12 мая 2010

Может ли конструктор быть приватным? Чем полезен приватный конструктор?

Ответы [ 15 ]

2 голосов
/ 12 мая 2010

Да, и он используется для предотвращения создания экземпляров и последующего переопределения. Это чаще всего используется в синглтон-классах.

1 голос
/ 25 августа 2018

Может ли конструктор быть приватным? Чем полезен приватный конструктор?

Да, может. Я считаю, что это еще один пример того, как это полезно:

//... 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;
        }
    }
}

В приведенном выше случае он предотвращает создание экземпляров абстрактного класса любым производным классом, кроме его статических внутренних классов. Абстрактные классы не могут быть финальными, но в этом случае закрытый конструктор делает его эффективным финальным для всех классов, которые не являются внутренними классами

1 голос
/ 12 мая 2010

Закрытые конструкторы предотвращают явное создание экземпляров класса вызывающими см. дополнительную информацию по PrivateConstructor

0 голосов
/ 07 марта 2014

По моему мнению, мы можем объявить конструктор частным, а также мы можно получить экземпляр этого класса в подклассе, используя статический метод в классе, в котором мы объявляем конструктор, а затем возвращаем объект класса. мы классифицируем этот метод из подкласса используя classname.method имя bcz, это статический метод, и мы получим экземпляр класса, в котором мы объявим const.

0 голосов
/ 12 мая 2010

Основная идея использования частного конструктора состоит в том, чтобы ограничить создание экземпляра класса извне JVM, но если класс имеет конструктор аргумента, то это означает, что он намеренно создается.

...