是的,你可以做到这一点。实际上有不止一种方式。 (注意:这个答案中唯一的Android特定部分是你找出平台版本的方式。)
假设类X
在版本2.0以后有方法void y()
但以前没有。
不引入任何编译时间依赖关系,调用此方法的一种方法是使用反射来定位方法并在其上调用invoke
。例如:
X x = ...
if (BUILD.VERSION.RELEASE.compareTo("2.0") >= 0) {
// (exception handling omitted ...)
Method m = c.getClass().getDeclaredMethod("y");
m.invoke(x);
}
另一种方法是创建一个版本兼容适配器API为您的应用程序是这样的:
/** Version compatibility adapter API */
interface Compat {
void doY();
}
/** Adapter class for version 1 */
class CompatV1 {
public void y(X x) {
// do nothing
}
}
/** Adapter class for version 2 */
class CompatV2 {
public void y(X x) {
x.y();
}
}
//
// Code to instantiate the relevant adapter for the current platform.
//
Class<?> compatClass;
// (Exception handling omitted)
if (BUILD.VERSION.RELEASE.compareTo("2.0") < 0) {
compatClass = Class.forName("...CompatV1");
} else {
compatClass = Class.forName("...CompatV2");
}
// (Exception handling omitted)
Compat compat = (Compat) compatClass.newInstance();
// The adapter object can be passed around as a parameter, wrapped
// as a singleton or injected using dependency injection.
// Invoke X.y() as follows:
X x = ...
compat.y(x);
第二个版本看起来有点重量级的,但它的优点是动态(慢,非类型安全)代码只执行一次,并且版本特定的代码与代码的其余部分隔离。在现实生活中,您可能会将许多方法放入适配器界面。
这种方法需要更多的思考,以了解如何设计兼容性API,以便将版本依赖性与其他代码完全隔离。您可能还必须修改适配器API,并为每个新(不兼容)主版本创建新的适配器类。
最后,如果你需要,以适应使用中的旧版本是类或方法引起这样的平台API的变化在新的版本中删除,那么你将需要编译您的各种适配器类(如CompatV*
类)使用不同的Android SDK。这会让你的构建过程变得更加复杂。
对于其他 “以” 在这个问题上,阅读对Android博客下面的文章:
除了你的答案,这里有一些样本项目展示的技术:http://github.com/commonsguy/cw-advandroid/tree/ master/Contacts/Pick/http://github.com/commonsguy/cw-advandroid/tree/master/Contacts/Spinners/ – CommonsWare 2010-08-23 21:55:01