【问题标题】:Common interface method implementation in javajava中常见的接口方法实现
【发布时间】:2016-02-19 05:30:44
【问题描述】:

我有 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();
    }
}

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

【问题讨论】:

    标签: java interface java-8 static-methods


    【解决方案1】:

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

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

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

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

    欲了解更多信息,请参阅Oracle's documentation on the feature

    如果您能够对代码进行更广泛的更改,您可以使用的另一种策略是使用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();
    }
    

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

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

    【讨论】:

    • 一个更彻底的模式是从接口public interface DM开始 - 创建一个具有通用/共享/默认实现public abstract class AbstractBaseDM implements DM的抽象基类,然后扩展public class A extends AbstractBaseDMpublic class B extends AbstractBaseDM(但是使用Java 8 我将在许多情况下使用 default
    【解决方案2】:

    您可以使用 Java 8 创建一个 default 方法。它有一些限制,但对一些常用的共享功能很有用。

    https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

    interface DM {
    
        default public void doSomething() {
          System.out.println("Hi");
        }
    
    }
    

    【讨论】:

    • 会起作用 - 虽然请注意,接口的默认方法实际上是为了确保在将新方法添加到接口时所有实现类不会中断。如果您确实需要两个或多个类的通用方法 - 考虑一个抽象类或组合。
    【解决方案3】:

    首先,interface 不是一个类。接下来,是的,使用java 8的default methods,您可以将方法定义添加到interfaces

    【讨论】:

      【解决方案4】:

      你可以试试这个

      interface DM 
      {
          public void doSomething();
      }
      
      class A implements DM
          {
              public void doSomething()
              {
                  System.out.println("Hello World");
              }
          }
      
      class B implements DM
          {
              public void doSomething()
              {
                  System.out.println("Hello World");
              }
          }
      class Test111
      {
          public static void main(String args[])
          {
              System.out.println("Hello");
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-27
        • 2014-07-11
        • 2014-10-25
        • 1970-01-01
        • 1970-01-01
        • 2013-10-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多