代码之家  ›  专栏  ›  技术社区  ›  Audrius MeÅ¡kauskas

instanceof与重定向方法

  •  1
  • Audrius MeÅ¡kauskas  · 技术社区  · 10 年前

    在重构过程中,我需要通过添加额外的参数来扩展现有的接口。现在有许多旧类实现了无参数版本,还有一些新类实现了带参数版本:

    void exec(int parameter);
    

    与

    void exec();
    

    最终,我需要接受将两个接口实现到同一集合中的类,并在同一方法中稍后处理。似乎有两种可能的方法:

    \1.使用 instanceof :

    int parameter = ...
    if (a instanceof NewInterface) 
        ((NewInterface) a).exec(parameter);
    else
        ((OldInterface) a).exec();
    

    这样做的好处是 NewInterface 和 OldInterface 可以是独立的接口。当开发人员编写一个新类时,重写哪些方法可能更明显,重写错误的方法将导致编译时错误。

    \2.将单个接口与定义的方法和从一个方法重定向到另一个方法的父抽象类一起使用:

    abstract class Common {
        abstract void exec();
        void exec(int param) { exec(); }
    }
    

    这样可以避免 运算符 这在一些讨论中被认为是糟糕的,但现在在每个新类中,我们都必须添加一个看起来奇怪的存根:

     // This is not used anymore
     void exec() { };
     // This is a real functionality 
     void exec(int param) { ...
    

    看起来也不是最好的设计,尤其是考虑到错误调用这个存根的可能性。

    我应该使用第三种方法,还是在instanceof的使用合理的情况下?

    1 回复  |  直到 10 年前
        1
  •  2
  •   Adam Michalik    10 年前

    如果您使用的是Java 8,您可以使用 default implementation :

    public interface MyInterface {
    
        void exec();
    
        default void exec(int param) {
            exec();
        }
    }
    

    这个 exec(int) 自然可以被具体类重写。

    另一个解决方案是 NewInterface extends OldInterface 。然后新类实现 NewInterface#exec(int) 和 OldInterface#exec() ,新客户端可以选择调用哪个方法,而旧客户端只知道 OldInterface .