Java接口 - 实现对

N8g*_*N8g 15 java design-patterns

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

我的第一直觉是用静态方法创建一个具体的类.然后,当我想要默认功能时,我会将功能委托给静态方法.

这是一个简单的例子:

接口

public interface StuffDoer{
    public abstract void doStuff();
}
Run Code Online (Sandbox Code Playgroud)

具体实施方法

public class ConcreteStuffDoer{
    public static void  doStuff(){
        dosomestuff...
    }
}
Run Code Online (Sandbox Code Playgroud)

使用默认功能的具体实现

public class MyClass implements StuffDoer{
    public void  doStuff(){
        ConcreteSuffDoer.doStuff();        
    } 
}
Run Code Online (Sandbox Code Playgroud)

这里有更好的方法吗?

编辑

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

Yis*_*hai 25

这是我要采取的方法:

public interface MyInterface {

      MyInterface DEFAULT = new MyDefaultImplementation();

      public static class MyDefaultImplemenation implements MyInterface {
      }
 }
Run Code Online (Sandbox Code Playgroud)

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

然后,您可以在实施中使用以下内容:

 public class MyClass implements MyInterface {
        @Override
        public int someInterfaceMethod(String param) {
             return DEFAULT.someInterfaceMethod(param);
        }
  }
Run Code Online (Sandbox Code Playgroud)

它比其他地方存在但未被接口引用的默认实现类更自我记录,并且最终更灵活.有了这个,您可以在需要时将默认实现作为方法参数传递(您无法使用静态方法).

当然,只有在没有涉及国家的情况下,上述情况才有效.


Pét*_*rök 16

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

更新:我看到,多重继承关闭了将接口更改为抽象类...在这种情况下,我会像你一样做.如果方法的默认实现不依赖于状态,那么它们的最佳位置确实在静态实用程序类中.但是,如果涉及到状态,我会考虑对象组合,它甚至可能最终像装饰器一样.


Rea*_*ted 7

现在Java 8已经出局了,这种模式更好:

public interface StuffDoer{
    default void doStuff() {
        dosomestuff...
    }
}

public class MyClass implements StuffDoer {
    // doStuff automatically defined
}
Run Code Online (Sandbox Code Playgroud)

Lambda得到了所有人的关注,但这是Java 8对我们公司最切实的好处.当我们不再需要使用抽象类来进行默认方法实现时,我们的继承层次结构变得更加简单.