考虑以下情况:
我正在开发一个框架,允许用户子类化框架提供的特定抽象类,这将允许他们将自己的功能插入到应用程序的流程中。
例如这样的一个类:
public class MyAbstractClass {
protected String step1(String input) {
// default implementation
}
public final void process(MyObject objct) {
// some steps
String someData = step1(object.getInput());
// some more steps
}
}
现在,在更新版本的框架中,我想更改step1方法以使用某个对象(可以将其转换为当前step1方法的参数)作为参数。但是,我不想破坏已经扩展此类的用户的代码。
我目前正计划这样做:
public class MyAbstractClass {
private boolean isOldStep1Overriden = true;
protected String step1(MyObject input) {
String oldValue = step1(input.getInput());
if (isOldStep1Overriden) {
// the method has been overriden - some logic here to handle this (assume this logic is known)
} else {
// the method has not been overriden - ignore the old value and carry out the new default processing
}
}
@Deprecated
protected String step1(String input) {
// default implementation
isOldStep1Overriden = false;
}
public final void process(MyObject objct) {
// some steps
String someData = step1(object);
// some more steps
}
}
有没有其他方法可以实现这样的用例?
以下选项也处于暂停状态:
编辑:一些更相关的背景信息:
有问题的框架实际上是一个部署到共享位置的应用程序,该框架的用户(开发人员)提交要在其中安装的扩展。因此,应用程序本身可以升级,而扩展的开发人员不会对其代码进行任何更改。举一个类似系统的例子,考虑firefox及其插件 - 两者都由不同的团队开发,而firefox可以在没有插件开发人员知识的情况下进行更新。