Java 静态类与单例的模糊情况

Java 静态类与单例的模糊情况,java,static,singleton,Java,Static,Singleton,我正在编写一个类,它将保存文件中的行数据。因此,它将有状态,但它是不可变的,并且只有一组数据。我最初的实现是一个静态类,初始化程序块调用方法来读取文件。通过这样做,我可以确保在加载类时读取数据,并且数据的任何访问器方法都不必检查这种情况 一位审阅者评论说该类应该是一个单例。虽然我理解他关于类具有state的论点,但我认为它是一个不可变的状态(当然,一旦文件被读取)的事实使这个论点无效 我确实有一些其他的顾虑,包括在静态初始化块中处理IOException(读取文件失败时抛出),但我对静态与单例问

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

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


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

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

首先,正如您所提到的,从您的代码中处理
IOException
s更容易,而不必处理它们在看似随机的时间抛出并导致类加载器失败

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

该原理的简单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框架,这个世界看起来都更干净。

这里有很多关于单身的意见:谢谢,弗雷德。我不知道有这么多人反对他们。或者,至少,在这么多人看来,有这么多人滥用了它们。我希望不变性(粗体)问题要么是一个危险信号,有人可以将其识别为支持静态实现的明确信号,或者2)对其无关性进行评论,并将注意力重新集中在做出该决定的真正标准上(假设它们存在)。五位观众认为“这个问题的答案将几乎完全基于观点”,这一事实很好地表明上述标准并不存在,因此我认为这也是一个答案。无聊的。值得一试,谢谢。我当然可以使切换w/o变得太困难,但是我想知道我的类是否真的满足单例标准,即需要成为唯一的实例。我当然不想重新读取该文件(有多个实例会导致),但我一直想回到这样一个事实,即这似乎基本上是一组常量,我希望通过方法而不是直接提供对这些常量的访问。因此,标题中出现了“模糊”。我仍然很伤心,但是我会花周末的时间来考虑这个问题。