实现时的Java重复方法

时间:2017-12-31 19:49:33

标签: java interface implements

我需要使用一个界面:

public interface I {  
      void go1();    
      void go2(); 
}

然后我有多个实现此

的类
public class A implements I {
    @Override  void go1() { ... }   
    @Override  void go2() { ... } 
}

public class B implements I {
   @Override   void go1() { ... }   
   @Override   void go2() { ... } 
}

" go2"方法对于所有类都是相同的,并且重复它有点多余

所以最好:

1)为所有这些类创建一个抽象并放入" go2"内?

2)创造" go2"在每个班级中,并且呼叫" super()"?

3)什么更好??

2 个答案:

答案 0 :(得分:2)

一种解决方案是使go2()成为default方法:

public interface I { 
    void go1(); 
    default void go2() { /* do logic*/}
}

因此,您可以在接口中封装go2方法的通用逻辑,并让所有子类继承该行为。

但是,重要的是要注意,默认方法只能在对其他接口方法的调用方面实现。因此,如果该方法依赖于私有状态,那么您将需要创建一个抽象类并按照您的提及定义那里的行为,并在需要时让子类调用它。

答案 1 :(得分:2)

  

为所有这些类创建一个抽象并将“go2”放入其中?

是的,这是传统的方式,如果go2()依赖于任何私有状态,它可能仍然是继承的唯一合理方式。即使使用Java 8和默认方法,您仍然无法在接口内使用任何私有状态。

如果方法不依赖于私有状态,则可以使用方法上的default关键字直接在接口中声明方法体(假设您使用的是Java 8或更高版本。)

如果您发现这两种方法都不能很好地工作,那么您可以使用组合而不是继承(使用类似装饰器设计模式的东西。)