Предотвращение вызова частного конструктора из класса в Java

мы можем ограничить создание объекта класса, сделав его конструктор приватным. Но этот конструктор все еще может быть вызван из класса. Есть ли способ предотвратить это в Java?

спасибо.

5 ответов


нет, нет никакого чистого способа сделать это. И я действительно не вижу причин для этого. Потому что если конструктор является частным, это означает, что он может быть вызван только из кода внутри этого точного класса (без подклассов или других классов в пакете), поэтому, если вы не хотите, чтобы конструктор вызывался, поместите комментарий к нему, который говорит об этом.

Так как каждый, кто может использовать конструктор, сможет удалить любые меры, которые вы поместили туда, чтобы предотвратить вызов конструктор, это не будет иметь реального эффекта.

кроме того, если вам нужен синглтон, вы можете захотеть, чтобы конструктор запускался хотя бы один раз (за исключением того, если ваша идея синглтона является чисто статическим классом).


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

его нельзя вызвать вне класса, не прибегая к отражению. Если вы не хотите, чтобы он вызывался более одного раза в классе, просто не делайте этого. Зачем писать код чтобы предотвратить действие,которое вы можете не делать?

давайте:

мы можем resrict создание объекта класса, создав его конструктор частный.

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

но этот конструктор все еще может быть звонили из внутри класс. Быть там в любом случае к запретить это на Java?

OP просит предотвратить вызов ограниченного конструктора внутри класса.

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

вот типичное использование частного конструктора:

public class Singleton
{
    private static final Singleton instance = new Singleton();

    public static void main(String[] args)
    {
        Singleton singleton = Singleton.getInstance();

        System.out.println(singleton);
    }

    private Singleton() {};

    public static Singleton getInstance() { return Singleton.instance; }

    public String toString() { return Singleton.class.getName(); }
}

Я не вижу смысла запрещать вызов частного конструктора.


официальный ответ-нет. Если кто-то может получить частный доступ к вашему классу, он может создать его экземпляр.

однако вы можете сделать это:

private static int count = 0;

private MyClass(){
    if(++count>1)throw new IllegalStateException(); //allow exactly one instantiation
}

нет, нет никакого способа, чтобы применить один экземпляр определенного типа. Самое близкое, что вы можете сделать, это, как вы описываете, сделать конструктор частным, чтобы только функции в этом классе могли его вызвать. Вы можете сделать что-то во время выполнения (например, создать исключение, если ваш статический экземпляр уже существует), но это ничего не даст вам во время компиляции.


Если вы делаете синглтон, перечисления-лучший способ пойти:

public enum MySingleton {
    INSTANCE;
    // add methods & stuff here
}

// Usage:
MySingleton.INSTANCE.doSomething();

"синглетность" гарантируется JVM - будет только один экземпляр.