静态类与单一模糊的模糊情形

时间:2014-10-03 18:35:27

标签: java static singleton

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

评论员评论说该课程应该是单身人士。虽然我理解他关于具有状态的类的论点,但我认为它是一个不可变状态(当然,一旦读取文件)这一事实就会使这个参数无效。

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

1 个答案:

答案 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框架,这个看起来更清晰。