最近我读了the blog post关于单身人士的缺点,其中作者声明:
为什么Singleton邪恶?
- 隐藏依赖项 - 使用一个或多个单例的组件隐藏了有关您的依赖项的重要信息。它不需要 很长一段时间来调用单例来填充你的代码库 kudzu,慢慢地将自己附加到系统中的每个类。曝光 这种依赖性迫使你在使用组件时考虑它。 它也使它更可重用,因为调用者可以理解它 要求以及如何满足这些要求。
醇>
单身人士如何隐藏其依赖关系以及它意味着什么?首先我想到无法注入依赖关系,但我们仍然有setter注入,所以没有意义。
请尽可能提供代码示例。
答案 0 :(得分:3)
1 Singleton可以有一个setter,但它有一个全局状态。因此,在应用程序的某个位置,您可以设置一个对象,它将影响应用程序另一个位置的行为。
2当你创建一个对象时,你不知道它的依赖关系,因为构造函数没有它们,你只需要写new MyObject()
;
但内部存在对另一个对象的依赖。你不知道依赖对象状态。
` public class MyObject {
private AnotherObject anotherObject = Singleton.getInstance();
public MyObject() {
//nothing here
}
}`
相反,它写起来更有用:
` public class MyObject {
private AnotherObject anotherObject;
public MyObject(AnotherObject comesFromOutside) {
this.anotherObject = comesFromOutside;
}
`
然后,您的代码用户将立即看到您的所有依赖项,而不会仅仅在编写new MyObject(new AnotherObject())
这里有更多信息: http://www.yegor256.com/2016/06/27/singletons-must-die.html
答案 1 :(得分:1)
我认为上面提到的是,通过使用单例,这段代码对使用相同单例的每一段代码都有一个依赖(或者更好的互连)。如果在一个地方改变了单身人士的状态,那么使用单身人士的所有其他地方可能会受到影响而不知道。
以下示例有点构建,但应该明确指出:
class ExistingClass {
public String getData() {
return Singleton.getInstance().getData();
}
}
class NewClass {
public void setData(final String aSomeData) {
Singleton.getInstance().setData(aSomeData);
}
}
ExistingClass
使用单身并假设它的状态是固定的。但有人为NewClass
添加了改变单身人士状态的选项。因此,NewClass
和ExistingClass
具有乍看之下不清晰可见的互连。
此外,通过在任意方法中直接使用Singleton.getInstance()
方法,在对类进行简短查看时,单例的使用不会直接显示。
但是,如果你使用有状态单身,这只会有问题。如果一个单身人士没有国家或者国家不能改变,那么使用单身人士并不是你应该担心的事情。特别是与Spring等依赖注入框架相结合。