Java接口目录结构?

25

Java中的接口应该放在自己的目录中吗?还是接口和它的实现都应该放在同一个目录(包)中?谢谢。

应该将Java中的接口放置在自己的目录中,而不是与其实现类放在同一个目录(包)中。这样可以更好地组织代码并使其更易于维护。

根据布置包的逻辑,我经常会添加一个“impl”子包来指定实现,例如:com.stackoverflow.questions,com.stackoverflow.questions.impl。 - Kylar
7个回答

17

接口不一定需要自己的目录。它们应该放在合适的位置,就像类应该放在合适的位置一样。在许多情况下,把它们放在同一个地方可能是有意义的。


15

我见过的一种模式是将接口放在基础目录中,然后从那里的子目录中放置实现。

例如,接口可以放在这里:

com.myproject.data.dao.CustomerDao (some people do ICustomerDao for interfaces, but some don't like that.)
com.myproject.data.dao.ProductDao

实现可能在这里:

com.myproject.data.dao.hibernate.HibernateCustomerDao
com.myproject.data.dao.hibernate.HibernateProductDao
com.myproject.data.dao.someotherorm.SomeOtherOrmCustomerDao
etc.

这可能在某些情况下有效,但在其他情况下可能无效,但这只是一个值得考虑的想法。


我最终采用了这种方法来完成一个项目。我意识到我真的不希望用户访问除接口以外的任何内容。据我所知,如果将类分离到它们自己的包中(访问级别需要是公共的),这是不可能的。我更喜欢你提供的方法,但对于我给出的情况,它并不适用。 - abrarisme
这种方法的缺陷甚至出现在编写DAO实现之前:它是按层打包。DAO应该放在需要它们的功能中,而不是放在单独的目录中。请参见此链接:http://www.javapractices.com/topic/TopicAction.do?Id=205 - Mihai Danila

7
作为已经存在一些好的观点,我只想再补充一件事情:
在一些项目中,我们甚至将所有接口放在一个子项目(Maven模块)中,将实现放在另一个子项目中。这样就可以完全将接口与实现分离,并在项目早期完成接口项目并将其交付给其他针对这些接口工作的团队。在每个项目中,我们使用相同的包。
总的来说,我会说,你应该分离接口和它们的实现,方式并不重要,只要保持一致即可。

1

同一個套件。使用者不應該知道或關心他們正在使用一個介面。


7
好的,使用"I"前缀是疯狂的。 - Tom Hawtin - tackline
1
用户需要知道是否需要自己实例化这些类。 - Powerlord
4
“同一软件包”并不能回答这个问题。在进行单元测试时,将测试放在与被测试类相同的软件包中是非常常见的,但是测试可能会放在完全不同的目录中。 - SyntaxT3rr0r

1
无论您想放在哪里,但是将接口保留在同一包和目录结构中绝对没问题。只需查看java api即可。如果选择任何一个包,您会注意到许多包含类和接口。一些接口由同一包中的类实现,而其他接口则不是。

我认为最糟糕的做法是坚持认为必须为接口使用不同的目录。我见过像/services和/impl等的目录,这些目录只会混乱目录结构。在我的当前工作场所,我们雇用了很多来去自如的承包商,我们的一些项目有多种类型的接口目录。我认为唯一使用单独目录的时候是如果您计划将接口复制到其他项目中,例如用于EJBs,但即使这样,如果您使用共享项目来处理接口,则它们可以具有相同的包。

因此,简短的回答是,您可以放在任何地方,但不要认为您需要将类和接口分开。在许多情况下,将它们保留在同一包/目录中更可取。


0

将接口放置在相同的目录(包)中并非必须。如果您的接口具有公共访问权限,则可以在任何包中导入它。


-1
我理解这个问题的意思(但是它的表述很奇怪)并不是关于接口是否应该在它们自己的目录中,而是你是否应该重新创建完整的目录结构(标题加粗以强调问题所在),其中一个分支仅包含接口,像这样:
pureooabstraction/
 |
 |_com/
   |
   |_example/
     |
     |__SomeInterface.java
     |__SomeOtherInterface.java

src/
 |
 |_com/
   |
   |_example/
     |
     |__SomeClass.java
     |__...

纯抽象/(pureooabstraction/)目录的结构只包含“纯抽象类”(从面向对象的角度来看,而不是Java中的“抽象”定义),也就是Java中的接口。

而琐碎的实现细节(在OOA/OOD级别不存在)所在的地方即为 src/ 目录。

如果您的开发过程是从OOA到OOD再到OOP,那么这肯定是有道理的。


1
不,他只是在问是否将接口放在与实现相同的包中。 - Ken Liu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接