Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.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_Instance - Fatal编程技术网

Java 将某个对象设置为实例而不是创建新对象意味着什么?

Java 将某个对象设置为实例而不是创建新对象意味着什么?,java,instance,Java,Instance,我在互联网上的某个地方读到了一些代码,我看到了这篇有趣的文章,引起了我的兴趣,我很好奇它是如何工作的 有一个名为ResourceManager的类,如下所示: public class ResourceManager { private static final ResourceManager INSTANCE = new ResourceManager(); public static ResourceManager getInstance() { return INS

我在互联网上的某个地方读到了一些代码,我看到了这篇有趣的文章,引起了我的兴趣,我很好奇它是如何工作的

有一个名为ResourceManager的类,如下所示:

public class ResourceManager {
  private static final ResourceManager INSTANCE = new ResourceManager();

  public static ResourceManager getInstance() {

      return INSTANCE;
  }

}
(里面有很多其他东西,但我认为没有必要包括在内)。然而,我发现有趣的是,在本文中,作者没有包含构造函数。事实上,在他的main方法中,他只对这个类进行了一次引用,而不是创建一个新对象,他只写了:

ResourceManager.getInstance().etc();
我以前从未见过这样的编码。我必须修改它,因为我需要使用ResourceManager对象,所以我所做的是:

ResourceManager res = ResourceManager.getInstance();

效果非常好。然而,我仍然不完全明白这里发生了什么。在没有构造函数的情况下如何创建这个类

在Java中,类有一个默认构造函数,假设您不提供构造函数。否则,从Wikipedia链接来看,它看起来像是一种将类的实例化限制为一个对象的设计模式。同样,要使其成为正确的
单例
,您可能应该添加一个
私有
构造函数

private ResourceManager() {
  super();
}
否则可能会有人实例化它。

这是一个实例,意味着类
ResourceManager
将只有一个实例(构造函数应该是
私有的
,以强制执行此操作)

然而,我仍然不完全明白这里发生了什么。在没有构造函数的情况下如何创建这个类


如果没有显式编写构造函数,Java将自动插入一个构造函数(假设超类也有一个默认构造函数)。

要回答关于没有构造函数的问题:

所有没有定义构造函数的java类都有一个隐式的public no args构造函数


但是,应该定义一个私有的无参数构造函数,因为这个类显然是一个单例类。但是如果没有私有构造函数,可以随时创建新实例。

如何
classmyclass{}
then
MyClass myObject=newmyclass()工作,即使“MyClass没有构造函数”@immibis当您没有指定任何构造函数时,Java会为您创建一个默认构造函数(没有参数)。如果指定一个,则必须使用它(即没有默认的无参数构造函数)。@Matthieu我知道这一点。我想看看Magnucasaligo(问题作者)是否知道这一点。好吧,在阅读了你们所有人所说的话之后,这很有意义。然而,这给我留下了另一个问题。使用单例模式的优势是什么?如果不这样做,会被认为是“糟糕的编码”吗?这并不是说有人将检查您自己的代码并将其更改为两个ResourceManager。正如其名称所暗示的那样,singleton模式的目的是提供对类实例的统一访问。因此,您只需调用
ResourceManager.INSTANCE
,而不是在每个需要它的类中传递
ResourceManager
类型的引用。检查一下JavaScript上的java单段,这很好。“如果你不这么做,它会被认为是“坏编码”吗?”不,实际上,有些人认为单体是反模式。所以我认为,当你在整个程序中确实需要一个对象的单个实例时,适度地使用它是很好的。因此,如果我说的任何类都是ResourceManager.getInstance().etc(),它将始终工作,因为ResourceManager只有一个实例?它工作的原因并不是因为只有一个对象。它之所以有效,是因为getInstance()是静态定义的。当静态方法返回实例(唯一的实例)时,您将有一个实例。总之,singleton模式提供了对单个实例的静态访问。