应该在哪个包中实现Java接口?

时间:2012-10-19 14:14:50

标签: java interface package

假设我有一个界面:

package org.my.dicom.CEchoSCU;

public interface CEchoSCU {
    // stuff here...
}

我还将有一个接口的实现:

public class SimpleCEchoSCU implements CEchoSCU {
    // stuff here...
}

我的问题是,哪个包应该包含实现?我已经看到其他开发人员将实现放在与接口(在这种情况下为org.my.dicom)相同的包中,以及使用单独包的情况(通常类似于org.my.dicom.impl)。除了个人偏好之外,是否有理由更喜欢一个而不是另一个?

6 个答案:

答案 0 :(得分:6)

一个类实现了的接口。我会把类放在一个与类的其余部分/包含的内容相关的包中,而不是反映它实现的一个接口的包。例如,如果我有200个实现Printable的类,我不会将它们全部放在com.mycompany.impl.printable包中。实现可打印的飞机类将包含其他飞机的包装。船类将与其他船只一起包装。实现Printable的Car类将与其他汽车产品一起包装。

如果所有SimpleCEchoSCU(以及任何其他未来的类)都实现了CEchoSCU,那么您应该考虑使CEchoSCU成为一个抽象基类并派生出不同的实现。无论哪种方式,(接口或抽象基类)事物都是完全相关的,我会将它们放在同一个包中。

答案 1 :(得分:3)

嗯,关于你将implementation班级和interface放在哪里,这不是一个严格的规则。您可以将它们放在任何包中,只要它们可以在应有的位置访问。

但是,当然,您还希望将所有related classes合在一个package中,将class not related合并到您的set of classes ,待在different package

大部分时间,我的方法是: - 我将interfaces保留在different package中,将implementing classes保留在different package中。这样,如果我想将我的接口提供给其他人,那么我可以直接赠送包含所有接口的包。

但同样,这完全取决于您的要求,以及您在代码中遵循的设计实践。

所以我选择的包名一般是: -

  • com.someName.api - >对于接口
  • com.someName.impl - >用于实现类。

这样我就可以轻松地将apiimplementation分开。

答案 2 :(得分:2)

我通常遵循以下规则:

  • 如果您想提供常见的实现,请将它们放在同一个实现中 包(例如List和ArrayList)
  • 如果您有可重用的实现,但是对于不同的技术或不同的业务功能,将它们放在单独的包中
  • 如果您有私有实现,其他人不应该直接实例化,请将它们放在* .impl或* .internal包中。这对于OSGi捆绑包来说非常普遍。

答案 3 :(得分:1)

我更喜欢将实现放在具有这样名称的包中:

path.to.package.of.interface.impl

但是,我不认为这是一个普遍的惯例,我想这是开发软件的组织所特有的。

答案 4 :(得分:1)

包作为一项规则是一个偏好和组织问题。有些地方会使用构建脚本来过滤掉API接口,例如,如果它们位于不同的实现包中,则可能更容易。真的,我认为最重要的是要保持一致,以便人们知道会发生什么(除非您使用的是对您施加限制的工具或脚本)。

答案 5 :(得分:1)

将实现类放在任何包中都没有错。这不会有任何补偿错误。但是,这取决于项目代码设置放置impl类的位置。在大多数情况下,实现类将与接口位于同一个包中。

然而,接口可以由不同类的类实现,因此在这种情况下,实现类和接口将在不同的包中。

示例是一个接口Bounceable可以由BallJelly甚至是Car实现!