Java中没有预处理器 - 如果我有条件地想要调试详细输出,那么最好的方法是什么?

时间:2013-12-19 16:16:40

标签: java compilation preprocessor

所以,在像C和C ++这样的语言中,我可以定义一个预处理器指令并像这样进行条件编译:

#define DEBUG 1


#ifdef DEBUG
   cout << "Some Stuff, blah blah blah" << endl;
#endif

我的目标是在Java中执行类似或类似的操作,以便我可以进行一些调试,只需打开或关闭DEBUG,即可快速进行调试或发布编译。在java中有什么接近这个的吗?也许是

public static final String DEBUG = "YES"

我不知道....有什么地方接近这个,我最好的策略是什么。建议?

编辑:我希望避免任何自定义库,因为我是OCD ..... lol

4 个答案:

答案 0 :(得分:1)

我使用布尔常量来做...

public static final boolean VERBOSE = true;
.
.
.
if (VERBOSE) log("your message here");

当VERBOSE = false时,编译器会忽略IF语句。

答案 1 :(得分:1)

我通常会这样做:

public static final bool FEATURE_SOMETHING = false

if (FEATURE_SOMETHING) {
   do something / instantiate other class etc.
}

答案 2 :(得分:1)

如果它只是您需要的日志记录,则有许多Java logging APIs可供选择,包括一个内置于Java本身。它们不会像条件代码那样方便。但是,当部署代码时,您可以打开日志记录并获取输出,这是您无法使用预处理代码执行的。

答案 3 :(得分:1)

在这种情况下,Java非常灵活,此外还有许多自定义库使您能够执行此操作(log4j)。

由于您不想使用它们中的任何一个,但仍允许您在不重新编译代码的情况下灵活地执行此操作,

  1. 定义属性文件(比如custom.properties)
  2.   

    enabledebug =真

    1. 定义全局属性

       class Global {
      
           public static boolean DEBUGFLAG=false;
      }
      
    2. 定义一个方法来读取属性,将标志值定义为全局变量

      public void load() {
        Properties props = new Properties();
        FileInputStream fis = new FileInputStream("....custom.properties")
        props.load(fis);
        Global.DEBUGFLAG= Boolean.valueOf(props.get("enabledebug"));
      }
      
    3. 从主方法

    4. 调用load方法
    5. 在需要打印详细

      时使用该标志
      if(Global.DEBUGFLAG) {
      
       //print some thing
      }