在Java中可以做一种#ifdef的事情吗,比如C/C++?
示例:
class Test
{
public static final boolean ANDROID = false;
public Test()
{
if (ANDROID)
{
// do stuff that won't compile if not on android
}
else
{
// do stuff that should be only done on desktop
}
}
}请注意,即使ANDROID是false,如本例所示,它仍将尝试在if中编译代码,尽管它不会(也不应该)编译。
我正在寻找一种进行条件编译的方法--如果if是false,编译器甚至不应该查看false。
我问题的上下文是,我在Eclipse中有一个处理应用程序。我在两个单独的项目中使用Android的正常处理和处理,但我希望能够在彼此之间移动项目的源代码,而不会出现编译器错误。例如,我希望能够拥有从Android项目到桌面项目的源代码文件,并且只需要更改几件事情--例如,将ANDROID = true更改为ANDROID = false。
我真的需要条件编译,因为当我将源代码从Android项目复制到桌面项目时,桌面库显然不会包含Android库,然后源代码甚至不会编译。
编辑:既然我知道Java中没有预处理器,那么我的问题是:在我的项目中是否有其他方法可以将源代码从一个复制到另一个,而只需进行非常小的更改),而不必手动注释特定的代码片段,并且必须记住这些代码的位置?
编辑2:这不是另一个问题的副本,因为我的问题包括可能存在编译器错误的代码,而将其作为副本关闭的问题不存在。(另一个问题只涉及即使没有#ifdef的代码也能很好地编译。)为了解释,对其他问题的最高评价(并被接受)的答案是关于编译的代码,但并不是在字节码中发出的。然而,我的问题涉及的代码,甚至不会编译的最初。
发布于 2015-07-30 11:55:58
正如其他人所说,你的实际问题的答案是否定的。
但是,您可以通过隔离Android或桌面代码来解决问题。您可以通过在eclipse中有三个单独的项目来实现这一点:
Android和桌面项目都会在它们的类路径中包含核心项目。在eclipse中,您可以这样做:转到Java构建路径,然后单击Projects选项卡,然后将Core项目添加到“必需项目”列表中。
然后设置代码,这样Android和Desktop项目才是您实际部署的,而核心项目包含它们之间共享的代码。下面是一个简单的例子。假设我们有一个示例类,如下所示:
public class Adder{
public void addAndPrint(int x, int y){
//code that will work on both Android and desktop
int sum = x+y;
if (ANDROID){
//code that will only work on Android
Log.v("example", "Sum:" + sum);
}
else{
//code that will only work on desktop
System.out.println("Sum: " + sum)
}
}
}您可以通过重构代码来隔离桌面和Android上的“核心”代码来解决这一问题。就像这样:
//example core class
public class CoreAdder{
Printer printer;
public CoreAdder(Printer printer){
this.printer = printer;
}
public void addAndPrint(int x, int y){
int sum = x+y;
printer.print("Sum: " + sum);
}
}
//example core interface. We might print differently on
//Android and Desktop, so implement this interface in each.
public interface Printer{
public void print(String printMe);
}然后,隔离只在桌面上工作的代码:
//on desktop, use System.out.println()
public class DesktopPrinter implements Printer{
public void print(String printMe){
System.out.println(printMe);
}
}
//on desktop, entry point is main()
public class DesktopMain{
public static void main(String... args){
DesktopPrinter printer = new DesktopPrinter();
CoreAdder adder = new CoreAdder(printer);
adder.addAndPrint(1, 2);
}
}而只适用于Android的代码:
//on Android, use a logger
public class AndroidPrinter implements Printer{
public void print(String printMe){
Log.v("example", "index=" + i);
}
}
//on Android, entry point is Activity
public class AndroidActivity extends Activity{
public void onCreate(Bundle savedInstanceState) {
AndroidPrinter printer = new AndroidPrinter ();
CoreAdder adder = new CoreAdder(printer);
adder.addAndPrint(1, 2);
}
}请注意,这只是一个例子,我知道System.out.println()和Log.v()都可以在任何一个平台上工作。但想法是一样的:将项目分割成多个项目,并使用接口来抽象出不同平台之间变化的行为。
发布于 2013-10-30 13:55:14
由于Java本机不包括预处理器,所以在编译之前,您有义务手动执行一个。C预处理器是m4,您可以自己运行它。
发布于 2013-10-30 13:52:53
java中没有像C、C++等预处理器,您所能做的就是注释掉代码。
https://stackoverflow.com/questions/19684155
复制相似问题