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

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

Спасибо.

9
задан informatik01 1 November 2013 в 23:37
поделиться

5 ответов

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

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

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

14
ответ дан 4 December 2019 в 06:49
поделиться

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

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

private static int count = 0;

private MyClass(){
    if(++count>1)throw new IllegalStateException(); //allow exactly one instantiation
}
6
ответ дан 4 December 2019 в 06:49
поделиться

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

3
ответ дан 4 December 2019 в 06:49
поделиться

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

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

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

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

2
ответ дан 4 December 2019 в 06:49
поделиться

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

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

Давайте рассмотрим:

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

Конструктор является частным, поэтому его нельзя вызывать вне класса, если клиент не использует 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(); }
}

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

9
ответ дан 4 December 2019 в 06:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: