单身人士如何隐藏其依赖关系?

时间:2018-01-13 19:39:30

标签: java singleton

最近我读了the blog post关于单身人士的缺点,其中作者声明:

  

为什么Singleton邪恶?

     
      
  1. 隐藏依赖项 - 使用一个或多个单例的组件隐藏了有关您的依赖项的重要信息。它不需要   很长一段时间来调用单例来填充你的代码库   kudzu,慢慢地将自己附加到系统中的每个类。曝光   这种依赖性迫使你在使用组件时考虑它。   它也使它更可重用,因为调用者可以理解它   要求以及如何满足这些要求。
  2.   

单身人士如何隐藏其依赖关系以及它意味着什么?首先我想到无法注入依赖关系,但我们仍然有setter注入,所以没有意义。

请尽可能提供代码示例。

2 个答案:

答案 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添加了改变单身人士状态的选项。因此,NewClassExistingClass具有乍看之下不清晰可见的互连。

此外,通过在任意方法中直接使用Singleton.getInstance()方法,在对类进行简短查看时,单例的使用不会直接显示。

但是,如果你使用有状态单身,这只会有问题。如果一个单身人士没有国家或者国家不能改变,那么使用单身人士并不是你应该担心的事情。特别是与Spring等依赖注入框架相结合。