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

Java 重构后保持兼容性而不修改旧版本,java,inheritance,compatibility,Java,Inheritance,Compatibility,我需要开发一种模块,它将作为一个JAR提供,使两个产品兼容。 假设我有一个产品名为ProductSource,另一个产品名为ProductDep。 ProductSource是完全独立的,ProductDep调用几个方法/类,甚至从ProductSource继承一些类。 ProductSource(PS)和ProductDep(PD)有几个版本。例如,假设一个客户端使用PD_v3和PS_v3,另一个客户端使用PD_V1和PS_v3。 我们的开发有些令人讨厌,我们无法更改任何版本,我们只能提供一个

我需要开发一种模块,它将作为一个JAR提供,使两个产品兼容。 假设我有一个产品名为ProductSource,另一个产品名为ProductDep。 ProductSource是完全独立的,ProductDep调用几个方法/类,甚至从ProductSource继承一些类。 ProductSource(PS)和ProductDep(PD)有几个版本。例如,假设一个客户端使用PD_v3和PS_v3,另一个客户端使用PD_V1和PS_v3。 我们的开发有些令人讨厌,我们无法更改任何版本,我们只能提供一个将加载到这些版本之上的jar。问题是,我们开发的PS_v3只考虑了PD_v3的后果,PS_v2和PD_v2以及PS_v1和PD_v1。现在我们认为我们的一些客户使用PSYVY使用PDYVX和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开发的,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){....}
    }
}
package com.some.other.package.a;
导入com.some.other.package.xxx.AClass;
[...]
/**
*MyClassA第2版
*/
公共类MyClassA扩展了AClass
{
公共AType1方法1(AType2 arg1、AType3 arg2、AType4 arg3){
试一试{
//我们尝试加载我们的最新版本
//无需在此包中搜索类版本。如果存在,将自动加载
Class clazz=Class.forName(“com.package.a.MyClassA”);
clazz.getConstructor(……)
等
}catch(ClassNotFoundException e){….}
}
}

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

你能让每个类实现相同的接口和/或让任何PD_vX实现支持最新接口的包装类吗。我真的不知道如何帮助你。我只想说,我为你和这个团队感到抱歉:/我不能编辑PD或PS。我只能添加一个罐子(几乎是用魔杖)让事情顺利进行。@PlínioPantaleão yeah thx。。。。我已经辞去这份工作,这应该是我离开前的最后一项任务。TOk,我不能解决传统问题,但我已经做了一个兼容性管理器,它将跟踪导入的更改。有用,因为您只需声明版本之间所做的更改,它将尝试检索可用的最新版本。经理可以扩展以进一步改进,但我将到此为止,因为我已决定编辑我的产品的所有以前版本,并且进一步的版本将只使用接口。我有很多改进…你能让每个类实现相同的接口和/或有一个包装类(es)使PD_vX的任何实现都支持最新的接口吗?我真的不知道如何帮助你。我只想说,我为你和这个团队感到抱歉:/我不能编辑PD或PS。我只能添加一个罐子(几乎是用魔杖)让事情顺利进行。@PlínioPantaleão yeah thx。。。。我已经辞去这份工作,这应该是我离开前的最后一项任务。TOk,我不能解决传统问题,但我已经做了一个兼容性管理器,它将跟踪导入的更改。有用,因为您只需声明版本之间所做的更改,它将尝试检索可用的最新版本。经理可以扩展以进一步改进,但我将到此为止,因为我已决定编辑我的产品的所有以前版本,并且进一步的版本将只使用接口。我有很多改进。。。