在Java中实现#ifdef

时间:2012-03-16 05:14:45

标签: java conditional-compilation

我有一个用C编写的算法,它有可以由C预处理器处理的代码,但由于java中没有预处理器,我不知道如何编写java代码来处理这样的事情。 C代码是

#ifdef Tile_size_utility
#define print_error 0
else
#define print_error 1
#endif

我如何在Java中实现它?

5 个答案:

答案 0 :(得分:3)

我们无法将其翻译为Java。我们必须分析设置属性(Tile_size_utility)的位置以及我们需要的位置print_error。然后我们可以实现一个等效的解决方案。

示例:假设,Tile_size_utility是一个系统属性(在环境中设置),我们需要PRINT_ERROR作为(布尔)标志,那么这应该有效:

public class MyClass {

  public final static boolean PRINT_ERROR = 
            (System.getProperty("Tile_size_utility") != null);

}

现在,如果你做了一些set Tile_size_utility=myutiliy或者用参数

启动java
-DTile_size_utility=myutiliy

然后PRINT_ERROR将设置为true

答案 1 :(得分:1)

你不能。

但是,Java确实具有继承和多态性。您可以利用这些概念和依赖注入模式以更清洁但不同的方式解决问题。

如果您发布有关print_error的详细信息,我可以给您一个更准确的答案。

答案 2 :(得分:1)

 Class ErrorVerbose { 
          private static boolean enabled = False;

          public static setEnable(boolean enable) 
                enabled = enable;
          }

          public static perror(String msg) {

               if (enabled) {
               /* Print */ 
               }

          }
   }


 class YourClass {

           public YourClass(....,boolean status) {

                ErrorVerbose.SetEnable(status)
                    .
                    . 
           }

   }

嗯,是的,要么你可以make是一个非静态类,以便其他类可以启用/禁用详细。制作ErrorVerbose类的好处是你可以添加更多的信息,如时间,日期,函数名称(调用)等,这使得它更具信息性我只是给了一个骨架。

答案 3 :(得分:0)

使用以下方法构建DefineManger:

abstract public class DefineManager {
    abstract public boolean isDefined(String k);
    abstract public String  getDefine(String k);
    abstract public void    setDefine(String k, String v);
    abstract public void     undefine(String k);
}

if (isDefined("Tile_size_utility")) {
  setDefine("print_error", "0");
}
else {
  setDefine("print_error", "1");
}

答案 4 :(得分:0)

JVM动态地将代码编译为本机,因此可以在运行时更改这些设置并获得相同的性能。

您可能会发现Java中不需要C ++支持的许多技巧,因为它有其他解决方案可以留给JVM。与其他语言相比,Java往往功能较差,但它所拥有的功能大大优化,可能会让一些开发人员感到惊讶。