【问题标题】:Should every Java domain class implement an interface?每个 Java 域类都应该实现一个接口吗?
【发布时间】:2010-12-02 22:10:40
【问题描述】:

我一直在查看我公司完成的另一个 Java 项目,在这个项目中,开发人员为几乎所有领域实体(有数百个)创建了一个接口。在某些情况下,我认为抽象是可行的,但在其他情况下,目前似乎不需要它。

每当实例被传递时,它们总是被引用并通过接口访问。

这种膨胀是因为太多的未来证明吗?还是这是合理的工程实践?

【问题讨论】:

  • 我遇到的奇怪情况:域对象的接口,但不是服务的接口。将这些服务抽象出来并将其注入我的代码中,使其成为一个完整的 PITA。而且他们每个人只为域对象做了一个实现。 !?!?!?!

标签: java class interface


【解决方案1】:

接口指定所需的行为而无需实现。它们允许您在不影响客户端的情况下交换实现。它们对于面向方面的编程或代理生成等技术特别有用。

但如果实现没有改变,我认为没有理由使用接口。

大多数模型对象都属于该类别。如果没有实现差异,请不要使用接口。

接口对于服务和持久性类来说非常棒,但我从未见过它们用于抽象模型对象。

【讨论】:

  • 持久性类是指 DAO 吗?
【解决方案2】:

显然,接口主要是一种设计工具,可以将具有共同特征的不同类联合起来。

但是像上面提到的接口在编写单元测试时也有很大帮助。 easymock 之类的工具非常适用于接口。

我个人喜欢为服务提供接口,但不一定是域对象,这取决于域对象的“丰富程度”。例如,如果他们做了很多文件系统的事情,或者与服务/dao 层有非常密切的联系,我可能也会在那里制作接口 - 以简化单元测试。

【讨论】:

  • 实际上让我改写一下。我累了,听起来我把接口看作是测试的东西......
  • @martin-algesten 测试是恕我直言的一个很好的理由来拥有接口。
【解决方案3】:

一个好的经验法则:不要为了抽象而引入抽象。仅当它以某种方式启用您的项目时才这样做。如果它使你的单元测试更容易,或者它使升级更容易,或者启用依赖注入等。不要让你的项目变得更复杂,这是有用的。

对于域对象,如果它们是 POJO,那么用它们制作接口确实没有任何好处。如果它们不是 POJO,那么我会争辩说它们实际上可能不是域对象......但我想这是一个不同的论点。

【讨论】:

    【解决方案4】:

    我认为他们想展示复杂性。如果您有多个实现或表明它将是一个扩展点,则您应该只有一个接口。

    【讨论】:

    • 他们会争辩说,如果稍后提供了额外的实现......然后创建了一个接口......那么使用域对象的服务方法将不得不改变。跨度>
    • 然后问他们,为什么他们必须在实现更改时经常更改界面;-)(只是我的经验)
    【解决方案5】:

    使用接口可以让您对同一功能拥有多个独立的实现,这反过来又可以让您隐藏实现细节。

    您的实现中可能有公共类,如果您直接引用这些类,您可能会很想使用这些类。通过使用接口并且只有这样,您可以保证调用代码不会侵犯它被允许做的事情。

    在处理界面时,您可以使用各种高级技巧。需要添加调试。编写一个包装器,为每个方法执行日志记录,然后调用包装的实例。

    名单还在继续。代码到接口。你的代码会更好。

    【讨论】:

    • “代码到接口”只有在你有多个接口实现时才有意义。如果接口和实现之间存在 1:1 的关系,这并没有真正意义,只会增加维护开销。
    • 我在考虑要被外部代码使用的类。重新阅读问题后,我可以看到这也在实现内部使用。我同意这是过度的。仅当您需要它进行测试(有,是吗?)或模拟时才在内部代码中执行此操作。否则尽量简单。
    【解决方案6】:

    没有。如果您说为每个域都创建了一个接口,那有什么意义呢?接口实际上仅在将多个类组合在一起并表示常见行为时有用。

    抽象有时被高估了,而且很容易被夸大。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多