Java等效的#ifdef,允许不可编译的代码

Jas*_*zun 11 c java eclipse processing android

在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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,即使ANDROIDfalse,如在示例中,它仍将尝试编译内部的代码if,即使它不会(也不应该)编译.

我正在寻找一个方式做条件编译-编译器甚至不应该if,如果ANDROIDfalse.

我的问题的背景是我在Eclipse中有一个Processing应用程序.我在两个单独的项目中使用Android的正常处理和处理,但我希望能够在没有编译器错误的情况下将项目的源代码移动到彼此之间.例如,我希望能够拥有可以从Android项目移动到桌面项目的源代码文件,只需更改一些内容 - 例如,更改ANDROID = trueANDROID = false.

我真的需要它是条件编译,因为当我将源代码从Android项目复制到桌面项目时,桌面库显然不会包含Android库,然后源代码甚至不会编译.

编辑:所以现在我知道Java中没有预处理器,我的问题是:是否有任何其他方法可以在我的项目中使用此功能(能够将源代码从一个复制到另一个而只需进行非常小的更改)必须手动[取消]注释特定的代码片段并记住它们的位置?

编辑2:这不是另一个问题的重复,因为我的问题包括可能在其中存在编译器错误的代码,而这个作为副本关闭的问题则没有.(另一个问题只涉及即使没有#ifdefs 也可以正常编译的代码.)为了解释,对于另一个问题,最高评价(和接受)的答案是关于编译的代码,但是根本不在字节码中发出.但是,我的问题涉及最初甚至无法编译的代码.

Kev*_*man 3

正如其他人所说,您实际问题的答案是否定的。

但是,您可以通过隔离 Android 或桌面代码来解决您的问题。您可以通过在 eclipse 中创建三个独立的项目来完成此操作:

  • 核心:这是两个版本之间存在的“共享”代码。
  • Android:这仅包含在 Android 上运行的代码。
  • 桌面:仅包含在桌面上运行的代码。

您的 Android 和桌面项目都将在其类路径中包含 Core 项目。在 Eclipse 中,您可以通过转到 Java 构建路径,然后单击“项目”选项卡,然后将核心项目添加到“必需项目”列表中来完成此操作。

然后,您需要设置代码,以便您实际部署的 Android 和桌面项目,并且您的 Core 项目包含它们之间共享的代码。这是一个简单的例子。假设我们有一个如下所示的示例类:

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)
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

您可以通过重构代码来隔离可在桌面和 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);
}
Run Code Online (Sandbox Code Playgroud)

然后,您将隔离仅适用于桌面的代码:

//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);
   }
}
Run Code Online (Sandbox Code Playgroud)

以及仅适用于 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);
   }
}
Run Code Online (Sandbox Code Playgroud)

请注意,这只是一个示例,我知道 和 都System.out.println()可以Log.v()在任一平台上工作。但想法是相同的:将项目拆分为多个项目,并使用接口抽象出平台之间变化的行为。