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

进一步的辛辣技巧

  1. 提供U作为抽象,为U的本地实现某些function提供了机会…
  2. 使用I.this重新实现U与本地类和本地构造函数,而不是强制参数传递…
  3. 使用静态U …然后每个操作必须得到作为参数…
  4. 使用enum而不是class,仅用于静态函数,不需要任何其他对象(相当于第一个方法)

这样做的原因是将操作放在一个模块中,而不是让实用程序模块闲置,从而允许扩展最糟糕的重复实现。