我是 Android 的初学者程序员,我在互联网上找到了一些代码,但我无法理解这个“不打算实例化的类”是什么意思?!还有它有什么用。如果有人可以在这里提供帮助,我将非常高兴。
public class Settings
{
//some code
private Settings() {} // Class not meant to be instantiated
//some code
}
构造函数是私有的,所以只有类本身可以创建实例。这样做有几个原因。我的头顶上有一对...
该类是一个“实用程序”类,仅包含静态方法,因此实例化它没有任何意义。由于该类被评论为“类不打算被实例化”,我想这是最可能的原因。
类本身控制自己的生命周期并提供创建实例的方法。例如,如果该类是一个惰性单例,它可能会提供一个方法,该方法在第一次调用时创建一个实例,并在后续调用时返回该实例。
这个内部构造
private Settings() {}
是Settings
实例的构造函数。由于它是私有的,没有人可以访问它(在类本身之外),因此不能创建任何实例。
它是一个私有构造函数。这意味着外部类不能使用默认构造函数创建新实例。
全部Objects
都有Java
一个默认构造函数:
public MyObject() {}
这就是你如何拥有这个类:
public class MyObject{}
并且仍然可以调用:
MyObject mObj = new MyObject();
有时开发人员可能不希望这个默认构造函数可见。添加任何其他构造函数将使此构造函数无效。这可以是带有空参数的声明构造函数(带有任何可见性修饰符),也可以是不同的构造函数。
在上述情况下,很可能遵循以下模型之一:
Settings 对象在 Settings 类中被实例化,并且是所有代码运行的地方(一个通用模型Java
——这样的类也包含一个static main(String[] args)
方法)。
Settings 对象具有其他公共构造函数。
Settings 对象是一个Singleton
,其中 Settings 对象的一个static
实例通过访问器方法提供给 Objects 。例如:
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;
}
}
构造函数是私有的,所以它不应该被类之外的任何东西调用
它不是嵌套类,而是构造函数。私有构造函数意味着您不能从外部构造此类的实例,如下所示:
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;
}
看看是不是真的这样。
正如其他人所提到的,不能从类外部实例化具有私有构造函数的类。在这种情况下可以使用静态方法。
class Demo
{
private Demo()
{
}
static void createObjects()
{
Demo o = new Demo();
}
}
class Test
{
public static void main (String ...ar)
{
Demo.createObjects();
}
}
我们可以有私有构造函数。下面的程序描述了使用带有静态函数的私有构造函数
class PrivateConstructor {
private:
PrivateConstructor(){
cout << "constructor called" << endl;
}
public:
static void display() {
PrivateConstructor();
}
};
int main() {
PrivateConstructor::display();
}