首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java接口-实现对

Java接口-实现对
EN

Stack Overflow用户
提问于 2010-08-07 03:27:06
回答 10查看 10.2K关注 0票数 15

是否有为接口方法创建默认实现的首选方法或风格?假设我有一个常用的接口,在90%的情况下,我想要的功能是相同的。

我的第一反应是创建一个具有静态方法的具体类。然后,当我需要默认功能时,我会将该功能委托给静态方法。

下面是一个简单的例子:

接口

代码语言:javascript
复制
public interface StuffDoer{
    public abstract void doStuff();
}

方法的具体实现

代码语言:javascript
复制
public class ConcreteStuffDoer{
    public static void  doStuff(){
        dosomestuff...
    }
}

使用默认功能的具体实现

代码语言:javascript
复制
public class MyClass implements StuffDoer{
    public void  doStuff(){
        ConcreteSuffDoer.doStuff();        
    } 
}

这里有没有更好的方法?

编辑

在看了一些建议的解决方案后,我想我应该更清楚我的意图。从本质上讲,我试图解决Java不允许多重继承的问题。另外,需要说明的是,我并不是要声明Java是否应该允许多重继承。我只是在寻找为实现接口的类创建默认方法实现的最佳方式。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2010-08-10 00:45:12

这是我将采取的方法:

代码语言:javascript
复制
public interface MyInterface {

      MyInterface DEFAULT = new MyDefaultImplementation();

      public static class MyDefaultImplemenation implements MyInterface {
      }
 }

当然,MyDefaultImplementation可能需要是私有的,或者是它自己的顶级类,这取决于什么是有意义的。

然后,您可以在您的实现中包含以下内容:

代码语言:javascript
复制
 public class MyClass implements MyInterface {
        @Override
        public int someInterfaceMethod(String param) {
             return DEFAULT.someInterfaceMethod(param);
        }
  }

它比其他地方存在但不被接口引用的默认实现类更具自文档化,最终也更灵活。这样,您就可以在需要时将默认实现作为方法参数进行传递(使用静态方法不能做到这一点)。

当然,只有在不涉及状态的情况下,上述方法才有效。

票数 26
EN

Stack Overflow用户

发布于 2010-08-07 03:29:26

您可以将接口转换为抽象类,并根据需要为方法提供默认实现。

更新:我明白了,多重继承关闭了将接口更改为抽象类的过程……在这种情况下,我会和你做同样的事情。如果方法的默认实现不依赖于状态,那么它们的最佳位置确实是在静态实用程序类中。但是,如果涉及到状态,我会考虑对象组合,它甚至可能以类似于Decorator的形式结束。

票数 16
EN

Stack Overflow用户

发布于 2014-11-17 18:39:18

现在Java 8发布了,这个模式更好了:

代码语言:javascript
复制
public interface StuffDoer{
    default void doStuff() {
        dosomestuff...
    }
}

public class MyClass implements StuffDoer {
    // doStuff automatically defined
}

Lambda获得了所有的关注,但这是Java8给我们公司带来的最明显的好处。当我们不再需要抽象类来实现默认方法时,我们的继承层次结构变得简单得多。

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

https://stackoverflow.com/questions/3427073

复制
相关文章

相似问题

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