Java中的宏?

我知道Java中没有宏,但是有一种解决方法可以做这样的事情:

#ifdef _FOO_FLAG_ import com.xyzFoo; #else import com.abcFoo; #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.xyzFoo(); } else { myFoo = new com.abcFoo(); } 

如果这是不可能的(例如,如果至少有一个Foo类不在您的控制之下),那么您可以通过具有两个不同实现( XYZFooWrapperABCFooWrapper )的抽象FooWrapper类(或接口)实现相同的效果。

通常用Java处理这种事情的方式是使用dependency injection框架,例如Spring或Guice。 例如,在Spring中,您有两个不同的“应用程序上下文”来在两个实现之间切换,但其余的Java代码将是相同的。

唯一的问题是你的com.abcFoocom.xyzFoo确实需要实现一个通用的接口 – 即使有一个很好的dependency injection框架,它们也不足以让它们拥有相同的方法。

您还可以使用Class.forName()在运行时检测某些类的存在。 这允许您将相同的构建部署到不同的环境/设备。

我的答案链接到如何使用C预处理器被一个似乎错过了使用它的人准确地允许你写的事实转换为评论:

 #ifdef _FOO_FLAG_ import com.xyzFoo; #else import com.abcFoo; #endif 

在问题下查找隐藏的评论。

无论如何,因为所有你需要的是版本控制,这里是一个更简单的使用预处理器,应该与Android设置一起使用: http : //prebop.sourceforge.net/

如果您真正想要的是两个构建,那么在运行时包装类或编写代码以进行选择是浪费精力和不必要的复杂性。