Java 静态类与单例的模糊情况
我正在编写一个类,它将保存文件中的行数据。因此,它将有状态,但它是不可变的,并且只有一组数据。我最初的实现是一个静态类,初始化程序块调用方法来读取文件。通过这样做,我可以确保在加载类时读取数据,并且数据的任何访问器方法都不必检查这种情况 一位审阅者评论说该类应该是一个单例。虽然我理解他关于类具有state的论点,但我认为它是一个不可变的状态(当然,一旦文件被读取)的事实使这个论点无效Java 静态类与单例的模糊情况,java,static,singleton,Java,Static,Singleton,我正在编写一个类,它将保存文件中的行数据。因此,它将有状态,但它是不可变的,并且只有一组数据。我最初的实现是一个静态类,初始化程序块调用方法来读取文件。通过这样做,我可以确保在加载类时读取数据,并且数据的任何访问器方法都不必检查这种情况 一位审阅者评论说该类应该是一个单例。虽然我理解他关于类具有state的论点,但我认为它是一个不可变的状态(当然,一旦文件被读取)的事实使这个论点无效 我确实有一些其他的顾虑,包括在静态初始化块中处理IOException(读取文件失败时抛出),但我对静态与单例问
我确实有一些其他的顾虑,包括在静态初始化块中处理
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变得太困难,但是我想知道我的类是否真的满足单例标准,即需要成为唯一的实例。我当然不想重新读取该文件(有多个实例会导致),但我一直想回到这样一个事实,即这似乎基本上是一组常量,我希望通过方法而不是直接提供对这些常量的访问。因此,标题中出现了“模糊”。我仍然很伤心,但是我会花周末的时间来考虑这个问题。