首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >何时在Java中使用单方法接口

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

Stack Overflow用户
提问于 2013-03-04 19:21:21
回答 5查看 14.4K关注 0票数 24

我在很多像Spring这样的库中看到过,它们使用了很多带有单一方法的接口,比如BeanNameAware等。

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

在什么情况下,保留单一方法接口是有意义的?这样做是为了避免让单个接口变得笨重吗,比如ResultSet?或者,是否有一些设计标准提倡使用这些类型的接口?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-03-04 19:43:29

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

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

示例:

代码语言:javascript
复制
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); }
    });
}
票数 18
EN

Stack Overflow用户

发布于 2013-03-04 19:24:37

只有一个(或几个)方法的接口是高度有用的Strategy pattern的关键,它是“一些提倡使用这些类型的接口的设计标准”。

另一个常见的场景是当您想要回调时。Foo将Bar作为异步任务调用,当Bar完成某项任务时,使用回调将结果发送回Foo --回调可以是一个只包含一个方法的接口。(一个例子是Android中的许多监听器,Swing中的事件监听器...)

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

票数 5
EN

Stack Overflow用户

发布于 2013-03-04 19:35:59

在什么情况下,保留单一方法接口是有意义的?

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

接口用于封装几个类的公共行为。因此,如果在代码中有几个地方只需要调用有限的类方法集,那么是时候引入一个接口了。方法的数量取决于您需要调用的确切内容。有时你需要one方法,有时你需要twomore,有时你需要don't need methods at all。重要的是,您可以将行为与实现分开。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15200362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档