【问题标题】:An elegant way to support multiple versions of the same class?支持同一类的多个版本的优雅方式?
【发布时间】:2022-01-04 17:25:30
【问题描述】:

我有以下代码:

MyVersion6 myClass = returnMyClass();

// about 50 lines of code that do the following:
// do some logic with fields of myClass
// create and return another class using some fields of myClass

现在我必须支持版本 7,我可以在 returnMyClass() 方法中返回它。

实现剩余 50 行的最优雅的方法是什么? 在这种情况下,MyVersion6 和 MyVersion7 支持完全相同的方法,但我不想这样做

if ( myClass instanceOf MyVersion6 )
      do the 50 lines using (MyVersion6) myClass 
else if ( ( myClass instanceOf MyVersion7 )
      do the exact same 50 lines using (MyVersion7) myClass 

有什么想法吗?

【问题讨论】:

  • 也许看看这里:stackoverflow.com/questions/5579309/…。您可以将这 50 行代码转换为接口中的方法,并从 myClass 调用该方法,而不管类如何。
  • 从长远来看,这里的一点肘部油脂可能更易于维护。也就是说,只要把每个工厂里重复的线都做一遍,完全分开。
  • 听起来你会受益于让 MyVersion7 扩展 MyVersion6,在必要时覆盖方法。那么你只需要执行这 50 行代码一次。

标签: java types casting type-conversion return


【解决方案1】:

我建议您创建一个接口,该接口将由 MyVersion6 MyVersion7 之类的类实现

例子

public class MyVersion7 implements someInterface{}
public class MyVersion6 implements someInterface{}

那你就可以查了

if ( myClass instanceOf someInterface)
      do the 50 lines using (someInterface) myClass 

instanceOf someInterface 如果有任何类实现了该接口,则返回 true。

【讨论】:

    【解决方案2】:

    新版本对象应避免更改接口 (API)。由于新版本与原始版本共享许多通用代码,我会使用继承并让动态调度处理差异。然后,我只会在具有特定方法的新版本的情况下使用强制转换。但是您应该避免在新版本中添加特定的方法。

    class MyObject {
        public String toString() { return "MyObject"; }
    }
    
    class MyObjectV2 extends MyObject {
        public String toString() { return "MyObjectV2"; }
    }
    
    class MyObjectV3 extends MyObjectV2 {
        public String toString() { return "MyObjectV2"; }
        public void v3specific() { System.out.println("v3 specific method");}
    }
    
    public class JavaApplication24 {
    
        public static void main(String[] args) {
            MyObject[] objects = {new MyObject(), new MyObjectV2(), new MyObjectV3()};
            for (MyObject o : objects) {
                System.out.println(o);
                if (o instanceof MyObjectV3)
                    ((MyObjectV3)o).v3specific();  
            }
    
        }
    
    }
    
    

    【讨论】:

      猜你喜欢
      • 2011-05-21
      • 2012-09-24
      • 1970-01-01
      • 2019-05-19
      • 2021-07-22
      • 2019-05-09
      • 2015-01-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多