java中的通用接口方法实现

She*_*nny 9 java static-methods interface java-8

我有2个实现特定接口的类.
我想实现一个由2个类共享的方法.
我可以将该方法实现添加到接口类,然后从2个类中调用该方法吗?

例如:

public interface DM 
{
    public static void doSomething() { 
        System.out.println("Hello World");}
    }

    public class A implements DM
    {
        doSomething();
    }

    public class B implements DM
    {
        doSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

这可行吗?
这样做的正确方法是什么?

谢谢

Ros*_*ter 7

是的,如果您使用的是Java 8,则可以创建一个default实现,如下所示:

public interface DM
{
    default void doSomething() { System.out.println("Hello World");}
}
Run Code Online (Sandbox Code Playgroud)

或者,如果它应该是静态的:

public interface DM
{
    static void doSomething() { System.out.println("Hello World");}
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅Oracle有关该功能的文档

如果能够对代码进行更广泛的更改,可以使用的另一种策略是使用abstract class而不是接口,而是使用类的实现类extend.您不希望编写默认值的界面中的任何方法都应标记为abstract.

public abstract class DM
{
    public void doSomething() { System.out.println("Hello World");}
    public abstract void doSomethingElse();
}

public class A extends DM
{
  doSomething();
}
Run Code Online (Sandbox Code Playgroud)

如果您想使用接口但不能/不会使用默认值,您也可以组合这些方法:

public abstract class DMImpl impelements DM
{
    @Override        
    public void doSomething() { System.out.println("Hello World");}
}

public class A extends DM
{
  doSomething();
}
Run Code Online (Sandbox Code Playgroud)

  • 一个更彻底的模式是从接口`public interface DM`开始 - 用common/shared/default实现创建一个抽象基类`public abstract class AbstractBaseDM实现DM`然后扩展`public class A extends AbstractBaseDM`和`public class B扩展AbstractBaseDM`(但是对于Java 8,我会在很多情况下使用_default_) (2认同)