首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java等价于允许不可编译代码的#ifdef

Java等价于允许不可编译代码的#ifdef
EN

Stack Overflow用户
提问于 2013-10-30 13:51:17
回答 6查看 12.5K关注 0票数 13

在Java中可以做一种#ifdef的事情吗,比如C/C++?

示例:

代码语言:javascript
复制
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
        }
    }
}

请注意,即使ANDROIDfalse,如本例所示,它仍将尝试在if中编译代码,尽管它不会(也不应该)编译。

我正在寻找一种进行条件编译的方法--如果iffalse,编译器甚至不应该查看false

我问题的上下文是,我在Eclipse中有一个处理应用程序。我在两个单独的项目中使用Android的正常处理和处理,但我希望能够在彼此之间移动项目的源代码,而不会出现编译器错误。例如,我希望能够拥有从Android项目到桌面项目的源代码文件,并且只需要更改几件事情--例如,将ANDROID = true更改为ANDROID = false

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

编辑:既然我知道Java中没有预处理器,那么我的问题是:在我的项目中是否有其他方法可以将源代码从一个复制到另一个,而只需进行非常小的更改),而不必手动注释特定的代码片段,并且必须记住这些代码的位置?

编辑2:这不是另一个问题的副本,因为我的问题包括可能存在编译器错误的代码,而将其作为副本关闭的问题不存在。(另一个问题只涉及即使没有#ifdef的代码也能很好地编译。)为了解释,对其他问题的最高评价(并被接受)的答案是关于编译的代码,但并不是在字节码中发出的。然而,我的问题涉及的代码,甚至不会编译的最初。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-07-30 11:55:58

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

但是,您可以通过隔离Android或桌面代码来解决问题。您可以通过在eclipse中有三个单独的项目来实现这一点:

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

Android和桌面项目都会在它们的类路径中包含核心项目。在eclipse中,您可以这样做:转到Java构建路径,然后单击Projects选项卡,然后将Core项目添加到“必需项目”列表中。

然后设置代码,这样Android和Desktop项目才是您实际部署的,而核心项目包含它们之间共享的代码。下面是一个简单的例子。假设我们有一个示例类,如下所示:

代码语言:javascript
复制
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上的“核心”代码来解决这一问题。就像这样:

代码语言:javascript
复制
//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);
}

然后,隔离只在桌面上工作的代码:

代码语言:javascript
复制
//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的代码:

代码语言:javascript
复制
//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()都可以在任何一个平台上工作。但想法是一样的:将项目分割成多个项目,并使用接口来抽象出不同平台之间变化的行为。

票数 3
EN

Stack Overflow用户

发布于 2013-10-30 13:55:14

由于Java本机不包括预处理器,所以在编译之前,您有义务手动执行一个。C预处理器是m4,您可以自己运行它。

票数 3
EN

Stack Overflow用户

发布于 2013-10-30 13:52:53

java中没有像C、C++等预处理器,您所能做的就是注释掉代码。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19684155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档