Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单例中的私有构造函数_Java_Design Patterns_Singleton - Fatal编程技术网

Java 单例中的私有构造函数

Java 单例中的私有构造函数,java,design-patterns,singleton,Java,Design Patterns,Singleton,私人构造函数能帮我什么忙 我的意思是,所有变量和方法都是静态的,即使我将构造函数保持为公共,它也不会改变任何内容。 假设有人为我的singleton创建了一个对象,什么都不会发生,因为这个类中的所有内容都是静态的,这意味着与类本身相关,而不是与对象相关。Java静态属性共享给所有对象 谁能给我一个合理的例子吗?你需要一个私有构造函数来阻止用户实例化你的类 如果您将构造函数公开,用户可以执行DBSingleton singleton=new DBSingleton(),这样您的类就不会是一个sin

私人构造函数能帮我什么忙

我的意思是,所有变量和方法都是静态的,即使我将构造函数保持为公共,它也不会改变任何内容。
假设有人为我的singleton创建了一个对象,什么都不会发生,因为这个类中的所有内容都是静态的,这意味着与类本身相关,而不是与对象相关。Java静态属性共享给所有对象


谁能给我一个合理的例子吗?

你需要一个私有构造函数来阻止用户实例化你的类

如果您将构造函数公开,用户可以执行
DBSingleton singleton=new DBSingleton()
,这样您的类就不会是一个singleton

单例类(编辑:与单例实例进行比较-参见注释)甚至不需要实例化;给它一个私有构造函数并声明所有其他静态方法就足够了,这迫使用户在类上调用它们

构造函数必须是私有的,以确保该类是一个单实例,无论您是否创建它的单个实例。如果没有声明私有构造函数,Java将自动为其提供一个公共的无参数构造函数

该类需要是一个单独的实例,这可能是出于安全考虑,也就是说,在您希望调用其上的方法的情况下,这些方法完全按照singleton所说的那样执行。如果您有一个类的实例没有显式地成为singleton,那么当您调用该类上的方法时,无法保证它正在运行singleton的实现,因为实际上您可能有一个子类
DBSingleton
,其中所述方法被重写。(如果您将它们作为
DBSingleton.someMethod()
调用,您当然会获得预期的行为,但如果您这样做:

 public class DBSingleton {

 private static DBSingleton instance = new DBSingleton();

 private DBSingleton() {
 // why do we need this constructor
 }
 public static DBSingleton getInstance() {
     return instance;
 }
}
所有赌注都输光了。)


为了避免类的其他实例,更合适的方法是将类声明为final。您给它一个私有构造函数,这样它也不能被实例化。(最终类或带有私有构造函数的类(或者零个非私有构造函数)足以使该类不可重写。)

首先,单例不一定要用静态方法实现为类。第二,当对象创建本身很繁重(CPU/网络/等等)时,您希望控制创建的实例数量,例如连接池。因为如果您的构造函数是公共的,任何人都可以调用它,从而创建单例的其他实例,这就破坏了单例的全部用途。如果创建多个实例不是问题,那么为什么首先将其设置为单实例呢?如果一切都是静态的,为什么还要创建一个实例呢?这甚至不是一个单独的实例。
实例如果没有创建
DBSingleton
的实例,就无法访问,而这反过来又无法完成,因为构造函数是私有的。您可能是指
公共静态DBSingleton getInstance()
@alfasin感谢您的链接,但我没有找到我的问题的答案,这与我在另一条评论中所说的完全不同。如果所有字段和方法都是静态的,那么创建单例就毫无意义。您根本不需要任何实例来访问类的静态成员。因此,将其设置为单例会使其非常混乱,并显示出缺乏理解。将构造函数设置为私有,而不提供任何getInstance()方法,这表明您永远不应该实例化该类。是的,但它不会有太大变化,因为java的静态属性是共享给所有对象的。所有字段都声明为静态,因此即使用户执行了DBSingleton=new DBSingleton(),他也将访问相同的字段。我说的对吗?@M.T no.如果所有字段和方法都是静态的,那么创建一个单例就毫无意义了。您根本不需要任何实例来访问类的静态成员。因此,将其设置为单例会使其非常混乱,并显示出缺乏理解。将构造函数设置为私有,而不提供任何getInstance()方法,这表明您永远不应该实例化该类。由于Java是一种OO语言,您应该使用对象通过接口从多态性和抽象中获益。如果您认为这是“过火”,那么为什么要使用Java?有很多非OO语言…@JBNizet我不太明白你的意思,我提供了getInstance方法。在java中有没有其他不使用静态字段的单例设计模式的实现?单例的要点是拥有一个类的唯一实例,以及实例字段和实例方法。因此,您可以将此实例作为参数传递,实现接口等。如果所有方法都是静态的,那么拥有一个实例是完全无用的:您将使用它做什么?拥有一个没有可能的实例且只有静态方法的类是可以的,但它绝对不是一个单例。@JBNizet它是一个单例,因为用户只能使用类(作为实例),不能创建同一类的多个实例。不,他们不能以与类实例相同的方式使用类:如果只有静态方法,就无法实现接口。无法扩展抽象类。无法将实例存储在集合中,等等。无论如何,singleton有一个确切的含义,这与“实用程序类”不同?用一个词代替另一个词只会带来混乱。我同意JB Nizet的观点,只是我认为他有点在与历史抗争——他所谓的“实用类”在许多其他地方被称为“单一类”,他说得对,这是混乱的。我倾向于看到(错误标记的)实用程序类,而不是真正的单例,这使得情况更糟。我自己也有点松懈。但这可能不会很快消失。@jbnize这场讨论不是让我更困惑了吗)
DBSingleton dbsInstance = DBSingleton.getInstance();
// ... all sorts of code, some of which might affect dbsInstance
dbsInstance.someMethod();