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

在java中实现单例模式而不使用私有引用?

在java中实现单例模式而不使用私有引用?,java,oop,object,singleton,private,Java,Oop,Object,Singleton,Private,在最近的一次讨论中,有人提出了这一问题,但未能妥善解决。然而,我给出了Enum的例子来回答这个问题,但他正在寻找其他方法。你能强调一下我们克服上述问题的方法吗 简短的回答 使用带有急切实例化的私有YourClass构造函数和公共YourClass变量 长答案 简短的回答 使用带有急切实例化的私有YourClass构造函数和公共YourClass变量 长答案 这是一个坏主意,但是如果您将private变量更改为public变量,您将实现您的目标。您可能也应该将变量声明为final,以避免意外,

在最近的一次讨论中,有人提出了这一问题,但未能妥善解决。然而,我给出了
Enum
的例子来回答这个问题,但他正在寻找其他方法。你能强调一下我们克服上述问题的方法吗

简短的回答
使用带有急切实例化的
私有YourClass
构造函数和
公共YourClass
变量

长答案


简短的回答
使用带有急切实例化的
私有YourClass
构造函数和
公共YourClass
变量

长答案


这是一个坏主意,但是如果您将
private
变量更改为
public
变量,您将实现您的目标。您可能也应该将变量声明为
final
,以避免意外,但这并不是严格必要的,也不是一个好主意(IMO)

值得一提的是,无法实现不包含显式变量来保存实例或
enum
的单例


以下是布洛赫对公共变量方法和私有变量方法之间的权衡所说的话:

“工厂方法方法的一个优点是,它使您可以灵活地改变您对类是否应该是单例的想法,而无需更改其API。factory方法返回唯一的实例,但是可以很容易地进行修改,例如,为调用它的每个线程返回一个唯一的实例。关于泛型类型的第二个优点在项目27中讨论。通常这两个优势都不相关,最终的现场方法更简单。”

我的论点是,知道你在未来不需要改变主意需要一定程度的先见之明

或者换句话说,你不知道:你只能预测它。你的预测可能是错误的。如果预测确实是错误的,那么你必须更改通过公共变量访问singleton的每一段代码

现在,如果您的代码库很小,那么您需要更改的代码量是有限的。但是,如果您的代码库很大,或者如果不完全由您更改,那么这种错误可能会产生严重的后果


这就是为什么它是一个坏主意。

这是一个坏主意,但是如果您将
private
变量更改为
public
变量,您将实现您的目标。您可能也应该将变量声明为
final
,以避免意外,但这并不是严格必要的,也不是一个好主意(IMO)

值得一提的是,无法实现不包含显式变量来保存实例或
enum
的单例


以下是布洛赫对公共变量方法和私有变量方法之间的权衡所说的话:

“工厂方法方法的一个优点是,它使您可以灵活地改变您对类是否应该是单例的想法,而无需更改其API。factory方法返回唯一的实例,但是可以很容易地进行修改,例如,为调用它的每个线程返回一个唯一的实例。关于泛型类型的第二个优点在项目27中讨论。通常这两个优势都不相关,最终的现场方法更简单。”

我的论点是,知道你在未来不需要改变主意需要一定程度的先见之明

或者换句话说,你不知道:你只能预测它。你的预测可能是错误的。如果预测确实是错误的,那么你必须更改通过公共变量访问singleton的每一段代码

现在,如果您的代码库很小,那么您需要更改的代码量是有限的。但是,如果您的代码库很大,或者如果不完全由您更改,那么这种错误可能会产生严重的后果


这就是为什么它是一个坏主意。

这就是如何使用
公共
字段实现
单例

public class Singleton {
      public static final Singleton INSTANCE = new Singleton();

      private Singleton() {}

}
进一步阅读此方法的优缺点:


来自Joshua Bloch的高效Java。

这是如何使用
公共
字段实现
单例

public class Singleton {
      public static final Singleton INSTANCE = new Singleton();

      private Singleton() {}

}
进一步阅读此方法的优缺点:


从Joshua Bloch的有效Java.

到downvoter:请解释一下您是否正确理解了这个问题?这个变量不必是私有的,只需要构造函数。@Stultuske,但是这个变量必须有急切的实例化,或者不会是单一的。我同意@BhargavModi。这是一个公平的问题。对于downvoter:请解释一下如果你对这个问题有正确的理解吗?不是变量必须是私有的,而是构造函数。@Stultuske,但是变量必须有渴望的实例化或者不会是单一的。我同意@BhargavModi。这是一个公平的问题。但是
getInstance()
方法返回的实例肯定存储在私有静态字段中。因此,我不确定我是否真的理解OP的问题。@Sam检查我的编辑…肯定存储在私有静态字段中?为什么?你可以将其公开…啊,当然,使用急切实例化!我想象的是惰性实例化,在这种情况下是公共实例化字段显然是有问题的。当它是公共的时,就不再需要getInstance方法,这是唯一的方法difference@JordiCastillaDownovte收回了!但是
getInstance()
方法返回的实例肯定存储在私有静态字段中。因此,我不确定我是否真正理解OP的问题。@Sam检查我的编辑…肯定存储在私有静态字段中?为什么?你可以将其公开…啊,当然,使用急切的实例化!我想象的是懒惰的实例