Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java中的宏?_Java - Fatal编程技术网

Java中的宏?

Java中的宏?,java,Java,我知道Java中没有宏,但是否有解决方法来执行以下操作: #ifdef _FOO_FLAG_ import com.x.y.z.Foo; #else import com.a.b.c.Foo; #endif 两个Foo类都有相同的方法。其中一个来自第三方图书馆。我希望能够通过更改一行代码轻松切换到默认库。这可能吗 编辑: 这两个类都超出了我的控制范围(其中一个来自Android项目的SQLCipher,另一个来自Android SDK)。我之所以需要它,是因为SQLCipher库目前在三星手机

我知道Java中没有宏,但是否有解决方法来执行以下操作:

#ifdef _FOO_FLAG_
import com.x.y.z.Foo;
#else
import com.a.b.c.Foo;
#endif
两个
Foo
类都有相同的方法。其中一个来自第三方图书馆。我希望能够通过更改一行代码轻松切换到默认库。这可能吗

编辑:

这两个类都超出了我的控制范围(其中一个来自Android项目的SQLCipher,另一个来自Android SDK)。我之所以需要它,是因为SQLCipher库目前在三星手机上不起作用。

不,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
类不在您的控制之下),那么您可以通过使用两个不同实现(
XYZFooWrapper
ABCFooWrapper
)的抽象
FooWrapper
类(或接口)来实现相同的效果.

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


唯一需要注意的是,您的
com.a.b.c.Foo
com.x.y.z.Foo
确实需要实现一个公共接口——即使有一个很好的依赖项注入框架,它们也不能简单地拥有相同的方法。

您还可以使用。这使您可以将同一版本部署到不同的环境/设备。

我的答案链接到如何使用C预处理器,但有人似乎忽略了这样一个事实:

#ifdef _FOO_FLAG_
import com.x.y.z.Foo;
#else
import com.a.b.c.Foo;
#endif
寻找问题下隐藏的评论

无论如何,因为您只需要版本控制,这里有一个更简单的预处理器,可以与android设置一起使用:


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

作为构建的一部分,通过预处理器运行它(并查看讨厌的内容)。我可以问一下您为什么需要这个吗?可能还有其他的方法,但Java当然不希望您这样做。您唯一的选择是跳出它并生成.java文件(以Ant为例)。这是Spring应该做的事情,不是吗?国际奥委会和国际奥委会等等。@b战神:等等。但是,只有当两个
Foo
都实现了一个公共接口,或者有一个公开了所有必要方法的公共基类时,Spring才能在这里发挥作用。IIRC他在其他地方写的Java没有自己的,因为它有一个简单的语法和一个易于编写的工具。OP更新了这个问题,表明这两个类都不在他的控制范围之内+1到包装器方法。-1这并不能解决问题,因为“捕获”使其无法用于OP的目的。我也不同意通过引入一个完整的框架来解决这样的问题。包装器类工作得很好。包装器类对于条件编译来说是一种非常无效的解决方法:。它只在有限的情况下运行良好,在其他情况下,它要么不实用,要么太复杂。