gpt4 book ai didi

java - 何时在 Java 中使用单一方法接口(interface)

转载 作者:IT老高 更新时间:2023-10-28 20:53:36 26 4
gpt4 key购买 nike

我在许多库中看到过,例如 Spring其中使用了很多带有单一方法的接口(interface),例如BeanNameAware等。

并且实现者类将使用单一方法实现许多接口(interface)。

在什么情况下保留单一方法接口(interface)有意义?是否避免使单个接口(interface)变得庞大,例如 ResultSet ?或者是否有一些设计标准提倡使用这些类型的接口(interface)?

最佳答案

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

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

例子:

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

关于java - 何时在 Java 中使用单一方法接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15200362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com