重构后保持兼容性而不修改旧版本

时间:2012-04-17 12:27:54

标签: java inheritance compatibility

我需要开发一种模块,它将作为JAR提供,使2个产品兼容。 假设我有一个名为ProductSource的产品,另一个叫做ProductDep。 ProductSource完全独立,ProductDep调用多个方法/类,甚至从ProductSource继承一些类。 ProductSource(PS)有几个版本,ProductDep(PD)也是如此。例如,假设一个客户端使用PD_v3和PS_v3,另一个客户端使用PD_V1和PS_V3。 我们的开发在某种程度上是令人讨厌的,我们不能改变任何版本,我们只能提供一个罐子,将加载在这些之上。问题是,我们仅考虑PD_v3后果开发了PS_v3,PS_v2与PD_v2和PS_v1与PD_v1。而且现在才考虑我们的一些客户使用PS_vY和PD_vX以及X!= Y.

以下是我需要解决的最糟糕的情况:

PS_v3类MyClassA:

package com.package.a;
import com.package.xxx.AClass;
[...]

/**
 * MyClassA Version 3
 */

public class MyClassA extends AClass
{

    public AType1 method1(AType2 arg1, AType3 arg2){ return null; //or whatever}
    public void method2(AType1 arg1){}
}


public abstract class AClass
{

    public abstract AType1 method1(AType2 arg1, AType3 arg2);
    public abstract void method2(AType1 arg1);
}

我的PD_v2将使用这个类但它是用PS_v2开发的,它具有相同的类:

package com.some.other.package.a;
import com.some.other.package.xxx.AClass;
[...]
/**
 * MyClassA version 2
 */
public class MyClassA extends AClass
{

    public AType1 method1(AType2 arg1, AType3 arg2, AType4 arg3){ return null; //or whatever}
    public abstract AType1 method2(){}
}


public abstract class AClass
{

    public abstract AType1 method1(AType2 arg1, AType3 arg2, AType4 arg3);
    public abstract AType1 method2();
}

因此,如果我的PD_V2想要使用我的PD_V3类,他将遇到一些运行时问题。

示例:

import com.some.other.package.xxx.AClass; //error on this one because he cannot find the package
public class MyClassImpl extends AClass
{
    public AType1 method1(AType2 arg1, AType3 arg2, AType4 arg3){ return null; //or whatever}
    public abstract AType1 method2(){}
}

但是他使用V3包def,所以他找不到com.package.a.AClass所以我的想法是寻找每个版本并提供一个包含方法的每个可能签名的jar。

所以我的想法是提供这样的东西:

package com.some.other.package.a;
import com.some.other.package.xxx.AClass;
[...]
/**
 * MyClassA version 2
 */
public class MyClassA extends AClass
{

    public AType1 method1(AType2 arg1, AType3 arg2, AType4 arg3){ 
    try{
        //we try to load our latest version
        //no need to search for the class version in this package it will be loaded automatically if it exists
        Class<?> clazz =  Class.forName("com.package.a.MyClassA");
        clazz.getConstructor(......)
        etc....
    } catch(ClassNotFoundException e){....}
    }
}

我的问题在于抽象类......或者如果你有更好的解决方案。现在我正在插入我的兼容性文件夹,其中包含以前版本使用的所有类,以及自新版本以来删除的所有方法(是的,我的团队不知道注释已弃用TT)或任何方法签名已更改甚至课程搬了。

0 个答案:

没有答案