使用私有构造函数

时间:2013-08-20 13:00:47

标签: java oop

我是Android的初级程序员,我在互联网上找到了一些代码,我无法得到这个“不打算实例化的类”的意思?!还有什么用途呢。如果有人可以帮到我,我会很高兴。

public class Settings
{
    //some code
    private Settings() {} // Class not meant to be instantiated
    //some code
}

7 个答案:

答案 0 :(得分:8)

构造函数是私有的,因此只有类本身才能创建实例。这样做有几个原因。一对夫妇脱离了我的头顶......

  1. 该类是一个“实用程序”类,只包含静态方法,因此实例化它是没有意义的。由于该课程被评论为“不打算实例化的课程”,我想这是最可能的原因。

  2. 类本身控制自己的生命周期,并提供创建实例的方法。例如,如果类是一个惰性单例,它可能会提供一个在第一次调用时创建实例的方法,并在后续调用时返回此实例。

答案 1 :(得分:3)

这个内部构造

private Settings() {}

Settings个实例的构造函数。由于它是私有的,没有人可以访问它(在类本身之外),因此不能创建实例。

答案 2 :(得分:2)

这是一个私人构造函数。这意味着外部类无法使用默认构造函数创建新实例。

多一点信息

Objects中的所有Java都有默认构造函数

public MyObject() {}

这就是你可以拥有这个课程的方法:

public class MyObject{}

仍可以致电:

MyObject mObj = new MyObject();

私人建筑商

有时开发人员可能不希望此默认构造函数可见。添加任何其他构造函数将使此构造函数无效。这可以是具有空参数的声明构造函数(使用任何可见性修饰符),也可以是一个不同的构造函数。

在上述情况中,可能会遵循以下模型之一:

  1. Settings对象在Settings类中实例化,并且是运行所有代码的地方(Java的通用模型 - 其中这样的类还包含static main(String[] args)方法)

  2. Settings对象具有其他公共构造函数。

  3. Settings对象是Singleton,通过访问器方法向对象提供一个{Object}对象的static实例。例如:


  4. public class MyObject {
        private static MyObject instance;
        private MyObject(){}//overrides the default constructor
        public static MyObject sharedMyObject() {
            if (instance == null)
                instance = new MyObject();//calls the private constructor
            return instance;
        }
    }
    

答案 3 :(得分:1)

构造函数是私有的,因此它并不意味着被类外的任何东西调用

答案 4 :(得分:1)

它不是嵌套类,它是一个构造函数。私有构造函数意味着您无法从外部构造此类的实例,如下所示:

Settings s = new Settings(); //Compilation error! :(

现在,如果一个类无法实例化,它可能是什么?最可能的原因是类会从静态方法返回自身的实例,可能是单例。这些设置通常是程序的全局设置,因此单例模式非常适合这里。所以会有一个像这样的静态方法

static private TheOnlySettings = null;

static public getSettings()
{
    if(TheOnlySettings == null)
        TheOnlySettings = new Settings(); //Legal, since it's inside the Settings class
    return TheOnlySettings;
}

看看情况确实如此。

答案 5 :(得分:0)

正如其他人所提到的,具有私有构造函数的类无法从类外部实例化。在这种情况下可以使用静态方法。

class Demo
{

    private Demo()
    {
    }

 static void createObjects()
    {
       Demo o = new Demo();
    }

}

class Test
{
   public static void main (String ...ar)
{
    Demo.createObjects();
}

}

答案 6 :(得分:-1)

我们可以拥有私有构造函数。下面的程序描述了使用带有静态函数的私有构造函数

class PrivateConstructor {
    private:
    PrivateConstructor(){
        cout << "constructor called" << endl;
    }
public:
    static void display() {
        PrivateConstructor();
    }
};
int main() {
    PrivateConstructor::display();
}