我知道
Java中没有宏,但是有一个解决方法来做这样的事情:
#ifdef _FOO_FLAG_ import com.x.y.z.Foo; #else import com.a.b.c.Foo; #endif
两个Foo类都有相同的方法.其中一个来自第三方图书馆.我想通过更改单行代码,可以轻松切换到默认库.这可能吗?
编辑:
这两个类都不在我的控制之下(其中一个来自Android项目的sqlCipher,另一个来自Android SDK).我需要这个,因为sqlCipher库目前在SAMSUNG手机上不起作用.
解决方法
不,Java中没有常用的预处理器(尽管您可以在Java代码中使用C预处理器,但是我会阻止它,因为这将是非常不寻常的,会破坏大多数处理代码的工具).这样的选择通常在运行时完成,而不是Java中的编译时.
通常的Java方式是让两个类实现相同的接口,并通过接口引用它们:
IFoo myFoo; if (FOO_FLAG) { // possibly a public static final boolean myFoo = new com.x.y.z.Foo(); } else { myFoo = new com.a.b.c.Foo(); }
如果这是不可能的(例如,如果至少有一个Foo类不在您的控制之下),那么您可以通过一个抽象的FooWrapper类(或接口)与两个不同的实现(XYZFooWrapper,ABCFooWrapper)实现相同的效果.