防止在Java中调用类中的私有构造函数

时间:2010-05-23 19:04:01

标签: java constructor singleton private-constructor

我们可以通过使其构造函数为private来限制类的对象的创建。 但是仍然可以从类中调用此构造函数。 有没有办法在Java中阻止这种情况?

感谢。

6 个答案:

答案 0 :(得分:14)

不,没有干净的方法来做到这一点。而且我真的看不出这样做的理由。因为如果构造函数是私有的,这意味着他只能从这个确切类中的代码中调用(没有子类或包中的其他类),所以如果你不想调用构造函数,就对它进行注释这样说。

因为每个能够使用构造函数的人都能够删除你放在那里的任何措施以防止调用构造函数,所以它没有实际效果。

此外,如果你需要一个单例,那么你可能希望构造函数至少运行一次(除非你对单例的想法是一个纯静态类)。

答案 1 :(得分:9)

如果它是私有的,并且你不希望它在自己的类中调用,那么就有一种简单的方法可以阻止这样的事情:不要编写多次调用它的代码。你是这个班的作者。为什么要编写代码来防止你自己做一些在你无法控制的事情上呢?

如果不诉诸反思,就无法在课外召唤。如果你不希望它在课堂上多次调用,那就不要这样做了。为什么要编写代码来阻止您可以选择不执行的操作?

让我们回顾一下:

  

我们可以重新创建对象   通过制作它的构造函数的类   私有的。

构造函数是私有的,因此除非客户端使用反射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(); }
}

我无法看到不允许私人构造函数的调用。

答案 2 :(得分:6)

官方的答案是否定的。如果有人可以私下访问你的课程,他可以实例化它。

但是你可以这样做:

private static int count = 0;

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

答案 3 :(得分:3)

不,没有办法强制执行特定类型的单个实例。正如您所描述的,最接近的是将构造函数设置为私有,以便只有该类中的函数才能调用它。您可以在运行时执行某些操作(例如,如果您的静态实例已经存在,则抛出异常),但在编译时这不会得到任何东西。

答案 4 :(得分:2)

如果你正在制作一个单身人士,那么enums是最好的方式:

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

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

JVM保证“单一性” - 只有一个实例。

答案 5 :(得分:0)

是的,有一个简单的方法:只需使私有构造函数引发异常:

dplyr

请注意,我的答案有所不同,因为我对问题的解释与所列的大多数其他答案略有不同。许多其他答案都假设您希望类为单例,在这种情况下,构造函数需要精确地调用一次。我假设您不希望该类的任何实例,因此应将构造函数调用0次。