在C ++中,如果我们不希望某些语句编译成类似于断言函数调用的代码,我们通过#ifndef预处理程序指令来控制它们的编译。
我们如何用Java做到这一点?
我有一些System.out.println()语句用于调试,我想删除最终代码。
一种方法是使它们在布尔变量的影响下有条件地执行。有没有更好的方法呢?
由于我有一个java swing应用程序,我可以关闭System.out.println语句而不影响输出。这样做的方法是什么?
答案 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()
,我认为你很熟悉。
assert
语句如果评估为true则不执行任何操作,否则会对您大喊大叫,这非常适合调试。它们在默认情况下也不起作用,这意味着编译器将忽略它们,除非您明确告诉它不要。最终结果是一个调试工具,在您发送生产代码时会“蒸发”。