在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检查我的编辑…肯定存储在私有静态字段中?为什么?你可以将其公开…啊,当然,使用急切的实例化!我想象的是懒惰的实例