私有内部类实现了一个接口而不是父接口,为什么?

时间:2013-08-05 14:11:30

标签: java design-patterns

我找到了一个代码,其中有一个内部私有类,它实现了一个接口,并从它的封闭类中返回值。制作这样的东西有没有利益,而不是直接在封闭的类中实现接口?

类似的东西:

public class Foo {
 public Whatever getWhatever() {  return new Boo(); }
 private Whatever boo;
 private int n;
 private class Boo implements Whatever {
  @Override int getN() { returns n; }
 }
}

也许这里有某种设计模式,或者有些设计模式看起来与此类似?

5 个答案:

答案 0 :(得分:3)

一个重要原因是Foo的单个实例可以创建并返回Boo的许多单独实例。如果你想象Foo是一个集合类,Boo是一个迭代器;这将允许在同一个集合上进行多个并发迭代,同时保持集合的实现细节是私有的。

答案 1 :(得分:2)

这通常是一个API问题。应该“Foo”和“Whatever”真的有“is-a”(=继承)或“has-a”(=组合)关系。

设计只做“单一”事物(高凝聚力)的课程是很好的。

请确保不要使用实施细节来规范您的API。

答案 2 :(得分:1)

如果接口声明了多个方法,则可以使用该技术来避免污染父类的API,而是提供一个方法来获取私有类的实例。类定义变得更加冗长,但我认为读取和编写客户端代码变得更容易,至少在使用IDE时是这样。

根据具体情况,可能还有其他用途。

答案 3 :(得分:0)

与任何界面的利润相同。您将知道该类中存在该方法。如果要创建多个私有类,并且希望能够对它们调用特定方法,则可以实现该接口。

如果这是唯一的私人课程,则不会直接盈利。然而,它始终是安全的,因为接口要求您的类至少实现该方法的骨架。

答案 4 :(得分:0)

实际上有两种模式可供使用:

  1. Facade模式 - 在包装或与其他外部API交互时我做过类似的事情,我不希望我的代码被外部API接口污染。这将允许我的代码不知道外部API,并允许我稍后更改实现或隐藏外部API的丑陋或混淆。

  2. 工厂方法 - 通过创建和返回实例的方法,我们可以返回接口的不同实现,或者重新使用已经创建的实例而不占用更多内存。