0

我找到了一个代码,其中有一个内部私有类,它实现了一个接口并从它的封闭类返回值。做这样的事情有什么好处,而不是直接在封闭类中实现接口?

像这样的东西:

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; }
 }
}

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

4

5 回答 5

3

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

于 2013-08-05T14:18:40.237 回答
2

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

设计只做“单一”事情(高内聚)的类是很好的。

确保你没有用实现细节污染你的 API。

于 2013-08-05T14:30:13.860 回答
1

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

根据上下文,可能还有其他用途。

于 2013-08-05T14:18:55.770 回答
0

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

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

于 2013-08-05T14:14:58.763 回答
0

实际上这里可能使用 2 种模式:

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

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

于 2013-08-05T14:17:48.480 回答