【问题标题】:Optimize duplicated function with different parameter优化不同参数的重复功能
【发布时间】:2018-08-01 18:23:29
【问题描述】:

我有两个完全相同的函数和一个不同的函数,它们以TypeX 作为参数。所有TypeX 都具有相同的父类Type。虚拟代码如下:

public void Append(TypeA item) { //same code }
public void Append(TypeB item) { //same code }
public void Append(TypeC item) { //different code }

不知道有没有什么好的方法可以优化这些功能?我的代码需要根据类类型选择正确的函数,所以这里不能使用父类或者泛型类型,因为这会影响TypeC的参与度。

最好的东西是public void Append(TypeA item || TypeB item),但当然没有这样的东西可用。有什么想法吗?

【问题讨论】:

  • 你可以使用父类,然后为TypeC创建一个更具体的重载。

标签: java optimization coding-style


【解决方案1】:

虽然@erwin-bolwidt 提供的解决方案可行,但我建议您也考虑

private void baseAppend (TypeParent item) { //same code }
public void Append(TypeA item) { baseAppend (item); }
public void Append(TypeB item) { baseAppend (item); }
public void Append(TypeC item) { //different code }

这种方法将允许更松散的耦合以及未来专门记录和扩展的潜力

【讨论】:

  • 对于函数baseAppend(),我需要传入父类Type才能让TypeA和TypeB都被接受,对吧?
  • 或其接口
【解决方案2】:

在编译时根据对象的声明类型(不是实际类型)选择要调用的方法。将 TypeA 和 TypeB 的 Append 合并到一个接受 Type item 参数的方法中是安全的 - 它与当前代码没有区别。

但如果要选择实际类型,则需要使用instanceof。或者,您在类型上创建一个方法,该方法返回 append 方法中所需的任何内容。

public void append(Type item) {
    if (item instanceof TypeC) {
        // Do TypeC-specific stuff
    } else {
        // Do stuff for TypeA, TypeB, and any other subtype of Type
    }
}

或者更干净,如果唯一的区别在于你从物品中得到的东西:

public class Type {
    public X getWhateverYouWantToAppend() {
        // Return stuff for TypeA, TypeB, and any other subtype of Type
    }
}

public class TypeC extends Type {
    public X getWhateverYouWantToAppend() {
        // Return stuff for TypeC specifically
    }
}

public class YourOtherClass {
    public void append(Type item) {
        X thingToAppend = item.getWhateverYouWantToAppend();
        // Do the appending
    }
}

【讨论】:

    【解决方案3】:

    您可以为TypeATypeB 创建父类。然后将此类型用作重载函数的参数。

    这样可以避免重复代码。

    另一种方法是让这些类实现某个接口,然后将该接口用作重载函数的参数。

    第三,您可以使用泛型类型并将实现委托给相应的函数。

    【讨论】:

      【解决方案4】:

      在java中很简单,你可以使用方法重载来实现

      public class example{
      
      public static void print(String s) {
          System.out.println("string - "+s);
      }
      
      public static void print(int q) {
          System.out.println("number - "+q);
      }
      
      public static void main(String[] args) {  
          print(12);
          print("welcome");
      }
      }
      

      输出

      number - 12
      string - welcome
      

      【讨论】:

        猜你喜欢
        • 2019-08-10
        • 1970-01-01
        • 2020-01-16
        • 2014-06-09
        • 2016-04-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多