如何在执行java代码时省略一些System.out / logging语句?

时间:2010-05-15 19:27:27

标签: java

在C ++中,如果我们不希望某些语句编译成类似于断言函数调用的代码,我们通过#ifndef预处理程序指令来控制它们的编译。

我们如何用Java做到这一点?

我有一些System.out.println()语句用于调试,我想删除最终代码。

一种方法是使它们在布尔变量的影响下有条件地执行。有没有更好的方法呢?

由于我有一个java swing应用程序,我可以关闭System.out.println语句而不影响输出。这样做的方法是什么?

5 个答案:

答案 0 :(得分:6)

使用slf4j等日志框架。您可以在调试时打印到控制台,省略生产中的所有内容,而无需重新编译应用程序。

答案 1 :(得分:4)

使用日志记录。请参阅log4j或commons logging。

通常,每个日志条目都具有严重性级别(如调试,信息,警告,错误),您可以配置从应用程序打印的内容。您可以打印所有这些以进行调试,但只能生成一些(例如信息和更高版本)。配置通常使用单个纯文本文件完成。

日志框架可以做更多的事情:自动添加更多细节(例如时间戳或线程ID),登录控制台,文件和/或数据库,旋转文件等。

答案 2 :(得分:3)

使用AspectJ表示您希望在编译时添加或删除的代码段,并在不使用AspectJ时进行编译。

答案 3 :(得分:0)

通常(不仅仅是为了您的示例),您可以创建接口的多个实现,并更改在执行期间使用的实例。这称为polymorphism,优于if / else的优点是:您选择实施一次,而不是每次使用它。

在Java中,多态性不会导致性能开销。

public interface MyInterface {
  void trashTheCPU();
}

public class MyRealImpl implements MyInterface {
  @Override
  public void trashTheCPU() {
    // actually trash the CPU with heavy tasks
  }
}

public class MyEmptyImpl implements MyInterface {
  @Override
  public void trashTheCPU() {
    // do nothing
  }
}

// ... somewhere else:

MyInterface mi = null;

public void initEveryting() {
  if(trashTheCPUconditionIsMet) {
    mi = new MyRealImpl();
  } else {
    mi = new MyEmptyImpl();
  }
}

答案 4 :(得分:0)

对于你正在做的事情,断言可能是要走的路。 {1.4}中的assert关键字被添加到Java中,概念上类似于C ++的assert(),我认为你很熟悉。

Java中的

assert语句如果评估为true则不执行任何操作,否则会对您大喊大叫,这非常适合调试。它们在默认情况下也不起作用,这意味着编译器将忽略它们,除非您明确告诉它不要。最终结果是一个调试工具,在您发送生产代码时会“蒸发”。

这是Sun's tutorial on Java asserts