2013-03-19 56 views
0

我已经看到了几个答案,以确定所有Java类是否应该实现接口。意见不同,我个人认为如果我确信只有一种实现方式,我不会看到编写接口的好处。Java中的框架:正确地直接暴露实现vs接口?

然而,在这种情况下,这个特定的类是一个框架的一部分,将被其他人使用。让用户直接使用实现还是应该为其创建接口是否合适?现在我正在控制用户通过公共/私人访问方法。

类如String不实现接口,我们直接使用它们。另一方面,该代码是相当古老的,可能事情自那时以来已经发生变化,并且为了避免破坏某些东西,它没有更新。

+0

这取决于。定义一个良好记录的接口意味着框架的用户不会接触到内部工作,他们可能会试图规避和控制自己。如果通过接口进入API的唯一途径,则保护框架。这也意味着,如果您愿意,您可以更改框架的底层实现(以使用不同的数据库或服务),而不会对框架工作的用户产生不利影响。永远不要假设事物不会改变。他们有这样做的坏习惯。 – MadProgrammer 2013-03-19 23:56:06

回答

0

首先:一般来说不要太教条约什么东西

想想这样:当你建造一栋房子时,你不应该决定你将要使用的一种指甲 - 你不能使用指甲来做任何事情,而且他们是故意设计的以不同的尺寸让您在需要时选择最适合您特定需求和材料的种类。

那么如何以及何时使用接口完全取决于类的类型,结构和预期用途。你当然不必总是每个班级使用一个界面 - 尤其是如果你重视SRP并且把你的班级放在一个小的范围内并且只限于一个责任的话。但有时您可能会这样做,有时甚至会发现很好的理由在同一个班级中实现多个界面。

接口的重要之处在于,您可以使用它们到抽象从一个特定的实现,无论您将有多少不同的实现。这有很多可能的原因,例如让别人为你处理实例化(如应用服务器;这种方法通常用于框架,顺便说一句),解耦组件以改善依赖关系管理,而不是忘记单元测试(当你的代码有模拟对象时更容易只是引用一个接口)等等。它不是根据API实现的次数来决定的,而是选择让代码结构清晰,松散耦合和可读的最佳方式。

要决定该做什么,首先了解更多关于您正在建设的房屋的信息:查看SOLID principles,并尝试将其应用到更好的位置 - 您会了解更多关于抽象和界面的信息,以及它们应该如何应用用于。他们也不会对所有事情都有一个答案,但是从那里开始,你可以开始做出自己的观察,并且可能发明自己的原则,以处理他们不包括的内容。他们绝对是一个开始的好地方。

1

如果您控制如何创建实例,那么发布的内容无关紧要。如果你不控制实例的创建方式,那么它就很重要。

客户端无法创建接口,他们只能创建实现它们的具体对象。然而,如果实例总是通过某种机制(工厂,查找,注入,无论什么)来创建的,那么大部分时间界面,抽象或具体类之间的区别只是一种非单调的,问题。

如果客户希望扩展实例,那么也会有影响。您可以扩展接口,但不能像扩展普通类一样。机制和后果有点不同。最后,大多数时候,一个具体的类可以转化为一个没有人比较聪明的界面,除非他们正在创建他们自己的实例。