何时在Java中使用单方法接口
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了何时在Java中使用单方法接口相关的知识,希望对你有一定的参考价值。
我在许多库中看到过像Spring
这样的库,它们使用了很多接口,其中包含BeanNameAware
等单一方法。
实现者类将使用单个方法实现许多接口。
在什么情况下保持单个方法接口是有意义的?这是为了避免使一个单一的界面笨重,例如ResultSet
?或者是否有一些设计标准主张使用这些类型的接口?
使用Java 8,保持单个方法接口非常有用,因为单个方法接口将允许使用闭包和“函数指针”。因此,只要您的代码是针对单个方法接口编写的,客户端代码就可以提交闭包或方法(必须与单个方法接口中声明的方法具有兼容的签名),而不必创建匿名类。相反,如果您使用多个方法创建一个接口,则客户端代码将不具备这种可能性。它必须始终使用实现接口的所有方法的类。
因此,作为一个通用指南,可以说:如果只向客户端代码公开单个方法的类可能对某个客户端有用,那么对该方法使用单个方法接口是个好主意。一个反例就是Iterator
界面:在这里,没有next()
方法只有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); }
});
}
只有一种(或几种)方法的接口是非常有用的Strategy pattern的关键,它是“一些主张使用这些类型接口的设计标准”。
另一种常见情况是您需要回调。 Foo将Bar称为异步任务,当Bar完成某些操作时,结果将使用回调发送回Foo - 这可以是仅包含一个方法的接口。 (这方面的一个例子是android中的许多监听器,Swing中的事件监听器......)
另外,如果你有两个彼此紧密耦合的类(让我们称它们为Foo和Bar)。 Foo几乎使用了Bar的所有方法,但Bar只需要一些来自Foo的方法。 Foo可以实现FooInterface
,然后发送到Bar。现在耦合更宽松,因为Bar只知道FooInterface,但不关心实现类包含的其他方法。
在什么情况下保持单个方法接口是有意义的?
在这种情况下,您需要一个只有一个方法的接口。
接口用于封装几个类的常见行为。因此,如果您的代码中有多个位置只需要调用有限的类方法,那么就应该引入一个接口了。方法的数量取决于您需要调用什么。有时你需要one方法,有时two或more,有时你don't need methods at all。重要的是,您可以将行为与实现分开。
Favor Composition over Inheritance
的Head First Design Pattern
教程书推荐了这种方法,可以动态地为类添加功能。我们来看下面的情况:
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类可以动态添加功能。
quack = new Quacks();
//or
quack = new DontQuack();
所以类似地,您可以动态地向类中添加多个行为。
您不是根据其中的方法数创建接口,而是定义系统组件所期望的行为,以便向其邻居提供单一责任。如果您遵循这个简单的原则/规则,您可能会或可能不会使用单个方法接口,具体取决于您定义的职责。我喜欢保持测试简单愚蠢,应用程序非常灵活,所以我通常有很多
以上是关于何时在Java中使用单方法接口的主要内容,如果未能解决你的问题,请参考以下文章