我正在编写一个将从文件中保存行数据的类。因此它将具有状态,但它是不可变状态,并且只会有一组数据。我的初始实现是一个静态类,初始化块调用方法来读取文件。通过这样做,我可以确保在加载类时读取数据,并且数据的访问器方法都不必检查该情况。
评论员评论说该课程应该是单身人士。虽然我理解他关于具有状态的类的论点,但我认为它是一个不可变状态(当然,一旦读取文件)这一事实就会使这个参数无效。
我还有其他一些问题,包括在静态初始化块中处理IOException
(在读取文件失败时抛出),但我对静态与单例问题的看法感兴趣。 / p>
答案 0 :(得分:2)
就个人而言,我更喜欢像单身人士这样的课程。
首先,就像你提到的那样,从你的代码中处理IOException
更容易,而不必处理它们在看似随机的时间被抛出并使类加载器失败。
其次,我更喜欢单身人士,因为他们仍然是实例 - 因此,当你进行测试时,它们更容易被替换。
这个原则的简单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框架,这个看起来更清晰。