5

假设我有一个界面:

package org.my.dicom.CEchoSCU;

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

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

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

我的问题是,哪个包应该包含实现?我见过其他开发人员将实现与接口放在同一个包中(org.my.dicom在本例中为 ),以及使用单独包的情况(通常类似于org.my.dicom.impl)。除了个人喜好之外,还有什么理由更喜欢其中一个吗?

4

6 回答 6

6

好吧,关于您将implementation班级和interface. 您可以将它们放在任何包中,只要它们可以在应有的位置访问即可。

但是,当然,您也希望将您related classes的所有内容合而为一package,而classnot related对您set of classes来说是different package

大多数时候,我的方法是: - 我将我interfaces的 in adifferent packageimplementing classesin保存起来different package。这样,如果我想将我的接口提供给其他人,那么我可以直接放弃包含我所有接口的包。

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

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

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

这样我就可以轻松地将 myapiimplementation.

于 2012-10-19T14:18:46.787 回答
6

一个类实现了一个接口,等等。我会将类放在与类的其余部分所做/包含的内容相关的包中,而不是反映它实现的一个接口的包中。例如,如果我有 200 个实现 Printable 的类,我不会将它们全部放在一个包 com.mycompany.impl.printable 中。实现 printable 的 Airplane 类将与其他飞机的东西放在一个包中。船类将与其他船的东西放在一个包中。实现 Printable 的 Car 类将与其他汽车材料放在一个包中。

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

于 2012-10-19T14:27:36.520 回答
2

我通常遵循以下规则:

  • 如果要提供通用实现,请将它们放在同一个包中(例如 List 和 ArrayList)
  • 如果您有可重用的实现,但例如针对不同的技术或不同的业务功能,请将它们放在单独的包中
  • 如果您有私有实现,其他人不应直接实例化,请将它们放在 *.impl 或 *.internal 包中。这对于 OSGi 包来说很常见。
于 2012-10-19T14:49:00.933 回答
1

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

path.to.package.of.interface.impl

然而,我不认为这是一个普遍的惯例,我猜它是特定于开发软件的组织的东西。

于 2012-10-19T14:17:38.720 回答
1

包通常是一个偏好和组织问题。有些地方会使用构建脚本来过滤掉 API 接口,例如,如果它们位于实现的单独包中,这可能更容易做到。真的,我认为主要的事情是保持一致,这样人们就知道会发生什么(除非您使用的工具或脚本会对您施加限制)。

于 2012-10-19T14:17:42.043 回答
1

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

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

例子是一个接口Bounceable可以被实现BallJelly甚至是一个Car

于 2012-10-19T14:23:13.277 回答