我找到了一个代码,其中有一个内部私有类,它实现了一个接口,并从它的封闭类中返回值。制作这样的东西有没有利益,而不是直接在封闭的类中实现接口?
类似的东西:
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; }
}
}
也许这里有某种设计模式,或者有些设计模式看起来与此类似?
答案 0 :(得分:3)
一个重要原因是Foo
的单个实例可以创建并返回Boo
的许多单独实例。如果你想象Foo
是一个集合类,Boo
是一个迭代器;这将允许在同一个集合上进行多个并发迭代,同时保持集合的实现细节是私有的。
答案 1 :(得分:2)
这通常是一个API问题。应该“Foo”和“Whatever”真的有“is-a”(=继承)或“has-a”(=组合)关系。
设计只做“单一”事物(高凝聚力)的课程是很好的。
请确保不要使用实施细节来规范您的API。
答案 2 :(得分:1)
如果接口声明了多个方法,则可以使用该技术来避免污染父类的API,而是提供一个方法来获取私有类的实例。类定义变得更加冗长,但我认为读取和编写客户端代码变得更容易,至少在使用IDE时是这样。
根据具体情况,可能还有其他用途。
答案 3 :(得分:0)
与任何界面的利润相同。您将知道该类中存在该方法。如果要创建多个私有类,并且希望能够对它们调用特定方法,则可以实现该接口。
如果这是唯一的私人课程,则不会直接盈利。然而,它始终是安全的,因为接口要求您的类至少实现该方法的骨架。
答案 4 :(得分:0)
实际上有两种模式可供使用:
Facade模式 - 在包装或与其他外部API交互时我做过类似的事情,我不希望我的代码被外部API接口污染。这将允许我的代码不知道外部API,并允许我稍后更改实现或隐藏外部API的丑陋或混淆。
工厂方法 - 通过创建和返回实例的方法,我们可以返回接口的不同实现,或者重新使用已经创建的实例而不占用更多内存。