Class内的接口
Q1。 我可以在java中的类中有一个接口吗?
Q2。 我可以在界面中有一个类吗?
如果是,那么在哪种情况下应该使用这样的类/接口。
Q1。 是的Q2。 是。
-
在您的类中,您可能需要多个接口实现,这仅与此特定类相关。 在这种情况下,使其成为内部接口,而不是公共/包私有
-
在您的界面中,您可以定义一些将由实现和客户端使用的数据持有者类。
后者的一个例子:
public interface EmailService { void send(EmailDetails details); class EmailDetails { private String from; private String to; private String messageTemplate; // etc... } }
我面临为实现接口的所有类提供常见的复杂操作,显然使用了接口的操作。
直到Java 8没出来……
请参阅http://datumedge.blogspot.hu/2012/06/java-8-lambdas.html (默认方法)
解决方法是:
public interface I { public Class U{ public static void complexFunction(I i, String s){ if(); ig(s) } } }
然后您可以轻松调用常用function(导入IU后)
U.complexFunction(i,"my params...");
可能会进一步细化,有一些更典型的编码:
public interface I { public Class U{ I me; U(I me){ this.me = me; } public void complexFunction(String s){ me.f(); me.g(s) } } U getUtilities(); } class implementationOfI implements I{ U u=new U(this); U getUtilities(){ return u; } }
然后打电话
I i = new implementationOfI(); i.getUtilities().complexFunction(s);
进一步的辛辣技巧
- 提供U作为抽象,为U的本地实现某些function提供了机会…
- 使用I.this重新实现U与本地类和本地构造函数,而不是强制参数传递…
- 使用静态U …然后每个操作必须得到我作为参数…
- 使用enum而不是class,仅用于静态函数,不需要任何其他对象(相当于第一个方法)
这样做的原因是将操作放在一个模块中,而不是让实用程序模块闲置,从而允许扩展最糟糕的重复实现。