不要为不可变对象声明接口
[编辑]所涉及的对象代表数据传输对象(DTO)或纯旧数据(POD)
这是一个合理的指导方针吗?
到目前为止,我经常为不可变(无法更改数据)的密封类创建接口。我一直在小心谨慎,不要在我关心不变性的任何地方使用该接口。
不幸的是,界面开始渗透代码(这不仅仅是我担心的代码)。您最终要通过一个接口,然后又想将其传递给某些代码,而这些代码确实想假设要传递给它的东西是不可变的。
由于这个问题,我正在考虑永远不要为不可变对象声明接口。
这可能会对单元测试产生影响,但是除此之外,这似乎是一个合理的指南吗?
还是我应该使用另一种模式来避免出现“扩展接口”问题?
(我之所以使用这些不可变的对象,有几个原因:主要是出于线程安全,因为我编写了许多多线程代码;还因为这意味着我可以避免将防御性的对象副本传递给方法。代码变得更加简单在很多情况下,当您知道某事物是不可变的时,如果您已经获得了接口,那么您就不会知道这一点。事实上,如果您不提供通过接口引用的对象的防御性副本,通常情况下您甚至无法克隆操作或序列化的任何方式...)
[编辑]
由于我想使对象不可变的原因,为了提供更多上下文,请参阅Eric Lippert的这篇博客文章:
http://blogs.msdn.com/b/ericlippert/archive/tags/immutability/
我还应该指出,我在这里使用一些较低级别的概念,例如在多线程作业队列中正在操纵/传递的项目。这些本质上是DTO。
约书亚·布洛赫(Joshua Bloch)也在他的《有效的Java》一书中建议使用不可变对象。
跟进
谢谢您的反馈。我已经决定继续使用该指导原则,以适用于DTO及其同类。到目前为止,它运行良好,但是只有一个星期了……看起来还不错。
我还想问一些与此有关的其他问题;尤其是我所说的“深层或浅层不变性”(我从深层和浅层克隆中窃取的术语)-但这是另一个问题。