【问题标题】:Fuzzy case for static class vs. singleton [closed]静态类与单例的模糊案例[关闭]
【发布时间】:2014-10-03 18:35:27
【问题描述】:

我正在编写一个类来保存文件中的行数据。因此它会有状态,但它是不可变状态,并且永远只有一组数据。我最初的实现是一个静态类,初始化块调用方法来读取文件。通过这样做,我可以确保在加载类时读取了数据,并且数据的任何访问器方法都不必检查这种情况。

一位审阅者评论说该类应该是单例的。虽然我理解他关于类具有状态的论点,但我认为它是一个 不可变 状态的事实(当然,一旦读取文件)会使这个论点无效。

我确实有其他一些顾虑,包括在静态初始化块中处理 IOException(当文件读取失败时抛出),但我对关于静态与单例问题的意见感兴趣。

【问题讨论】:

  • 这里有很多关于单身人士的意见:stackoverflow.com/q/137975/10077
  • 谢谢,弗雷德。我不知道有这么多反对他们。或者,至少,在很多人的观点中,它们被大量滥用。
  • 我希望不变性(粗体)问题要么 1)是一个危险信号,有人可以将其识别为支持静态实现的明确信号,要么 2)绘制 cmets它的无关性和重定向关注于做出此决定的真实标准(假设它们存在)。五位观众认为“这个问题的答案几乎完全基于意见”这一事实很好地表明了上述标准不存在,所以我想这也是一个答案。嗯。值得一试。

标签: java static singleton


【解决方案1】:

就个人而言,我更喜欢单例类。

首先,就像您提到的那样,在您的代码中处理IOExceptions 更容易,而不必处理它们在看似随机的时间被抛出并导致类加载器失败。

其次,我真的更喜欢单例,因为它们仍然是实例 - 因此在测试时它们更容易替换。

这个原理的简单java版本可能是这样的:

public class MyProductionClass {
    protected DataHolder getDataHolder() {
        return DataHolder.getInstance();
    }

    public int addOneToDataHolder() {
        return getDataHolder.getIntData() + 1;
    }
}

现在,假设我要测试addOneToDataHolder() 的业务逻辑。我所要做的就是模拟掉getDataHolder() 方法:

@RunWith(MockitoJUnitRunner.class)
public class MyProductionClassTest {
    @Mock
    private DataHolder dh;

    private MyProductionClass prod;

    @Before
    public void setUp() {
        MyProductionClass prod = spy(new MyProductionClass());
        doReturn(dh).when(prod).getDataHolder();
    }

    @Test
    public void testAddOneToDataHolder() {
        when(getDataHolder.getIntData()).thenReturn(1);
        assertEquals(2, prod.addOneToDataHolder());
    }
}

当然,对于任何 CDI 框架,这看起来会更加干净。

【讨论】:

  • 谢谢。我当然可以在没有太多困难的情况下进行切换,但我想知道我的班级是否真的符合需要成为唯一实例的单身标准。我当然不想重新读取文件(这会导致多个实例),但我不断回到这样一个事实,即这似乎基本上是一堆我想通过方法而不是提供访问的常量直接地。因此,标题中的“模糊”。我仍然很伤心,但会花周末时间考虑一下。
猜你喜欢
  • 2012-01-23
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 2011-02-23
  • 2015-08-12
相关资源
最近更新 更多