何时在Java中使用单方法接口

我在许多像Spring这样的库中看到过,它们使用了很多接口,其中包含BeanNameAware单一方法

实现者类将使用单个方法实现许多接口。

在什么情况下保持单个方法接口是有意义的? 这样做是为了避免使一个单一的界面变得庞大,例如ResultSet ? 或者是否有一些设计标准主张使用这些类型的接口?

使用Java 8,保持单个方法接口非常有用,因为单个方法接口将允许使用闭包和“函数指针”。 因此,只要您的代码是针对单个方法接口编写的,客户端代码就可以提交闭包或方法(必须与单个方法接口中声明的方法具有兼容的签名),而不必创建匿名类。 相反,如果您使用多个方法创建一个接口,则客户端代码将不具备这种可能性。 它必须始终使用实现接口的所有方法的类。

因此,作为一个通用指南,可以说:如果只向客户端代码公开单个方法的类可能对某个客户端有用,那么对该方法使用单个方法接口是个好主意。 一个反例就是Iterator接口:这里,只有没有hasNext()方法的hasNext()方法是hasNext() 。 由于具有仅实现这些方法之一的类是没有用的,因此拆分此接口不是一个好主意。

例:

 interface SingleMethod{ //The single method interface void foo(int i); } class X implements SingleMethod { //A class implementing it (and probably other ones) void foo(int i){...} } class Y { //An unrelated class that has methods with matching signature void bar(int i){...} static void bar2(int i){...} } class Framework{ // A framework that uses the interface //Takes a single method object and does something with it //(probably invoking the method) void consume(SingleMethod m){...} } class Client{ //Client code that uses the framework Framework f = ...; X x = new X(); Y y = new Y(); f.consume(x); //Fine, also in Java 7 //Java 8 //ALL these calls are only possible since SingleMethod has only ONE method! f.consume(y::bar); //Simply hand in a method. Object y is bound implicitly f.consume(Y::bar2); //Static methods are fine, too f.consume(i -> { System.out.println(i); }) //lambda expression. Super concise. //This is the only way if the interface has MORE THAN ONE method: //Calling Y.bar2 Without that closure stuff (super verbose) f.consume(new SingleMethod(){ @Override void foo(int i){ Y.bar2(i); } }); } 

只有一种(或几种)方法的接口是非常有用的策略模式的关键,它是“一些主张使用这些类型接口的设计标准”。

另一种常见情况是您需要回调。 Foo将Bar称为异步任务,当Bar完成某些操作后,结果将使用回调发送回Foo – 这可以是仅包含一个方法的接口。 (这方面的一个例子是Android中的许多监听器,Swing中的事件监听器……)

此外,如果你有两个彼此紧密耦合的类(让我们称之为Foo和Bar)。 Foo几乎使用了Bar的所有方法,但Bar只需要一些来自Foo的方法。 Foo可以实现FooInterface ,然后发送到Bar。 现在耦合更宽松,因为Bar只知道FooInterface,但不关心实现类包含的其他方法。

毫无疑问,对单方法接口持怀疑态度,因此问题为+1。

但是你知道,你创建了一个接口来支持一堆相关的方法。 如果你确实在那里有一个与任何其他方法没有明显关系的方法,那么单方法接口是合理的。

怀疑来的地方是你退后一步然后说:“这种方法真的与其他任何东西无关吗?” 如果你很高兴它不是,那就是“正确”的时间。

在什么情况下保持单个方法接口是有意义的?

在这种情况下,您需要一个只有一个方法的接口。

接口用于封装几个类的常见行为。 因此,如果您的代码中有多个位置只需要调用有限的类方法,那么就应该引入一个接口了。 方法的数量取决于您需要调用什么。 有时您需要一种方法,有时两种或更多种方法 ,有时您根本不需要方法 。 重要的是,您可以将行为与实现分开。

Head First Design Pattern书的Favor Composition over Inheritance教程推荐这种方法动态地向类添加function。 我们来看以下案例:

 public interface Quackable { public void quack(); } public class Quacks implements Quackable { public void quack(){ //quack behavior } } public class DontQuack implements Quackable { public void quack(){ //dont quack } } public class QuackableDuck{ Quackable quack; //add behavior dynamicall } 

所以QuackableDuck类可以动态添加function。

  quack = new Quacks(); //or quack = new DontQuack(); 

所以类似地,您可以动态地向类添加多个行为。

您不是根据其中的方法数创建接口,而是定义系统组件所期望的行为,以便向其邻居提供单一责任。 如果您遵循这个简单的原则/规则,您可能会或可能不会使用单个方法接口,具体取决于您定义的职责。 我喜欢保持测试简单愚蠢,应用程序非常灵活,所以我通常有很多