当我运行我的 PMD 插件时,他们说System.out.println
已经使用了。为什么System.out.println
使用不好?使用 PMD 插件时是否存在缺陷?克服这个问题的替代方法是什么?
5 回答
可以使用配置打开/关闭记录器,但System.out.println
不能。重要的是记录器提供不同级别的记录,并且可以通过配置文件再次控制。
同样使用记录器,您可以配置轮换、清除等,但不能为 sysout 做同样的事情。这在生产环境中特别有用,执行大量代码并生成大量日志记录。
System.out.println()
被认为是记录日志的不良做法。
因为
- 没有能力转动它(
ON
/OFF
) -
无需重新编译代码,无法设置输出级别 (
TRACE
,DEBUG
,INFO
,WARN
,ERROR
)
另一个缺点是程序的标准输出可以被重定向,例如,并不总是清楚输出的实际去向,例如,如果你这样做:
java SomeClass > someFile
在这种情况下,使用日志记录 API 将对您有所帮助。
但是在某些情况下,您也确实想将某些内容打印到标准输出,对于那些java.io.Console
无法重定向的情况,因此如果您正在运行命令行 java 程序,它会让您确信用户正在查看发给他们的消息。
System.out.println..
通常用于调试目的,即使在生产代码中也可以保留在代码库中。通过使用记录器,可以随意(并按优先级)启用/禁用此行为,并避免阻塞标准输出日志。
(来自“Java 日志记录规则”下的SourceMeter Java 用户指南)
需要导入 (.jar)
例子:
import org.apache.log4j.Logger;
class Foo{
private static final Logger LOG = Logger.getLogger(Foo.class);
public void testA () {
System.out.println("Entering test");
// Better use this
LOG.info("Entering test");
}
}
将过多的内容打印到 System.out 可能会成为性能瓶颈,因为它是同步的,来自 PrintStream 的代码:
public void println(float x) {
synchronized (this) {
print(x);
newLine();
}
}
这是因为,PMD 定义了一个名为的 java 日志记录规则,该规则在代码SystemPrintln
中检测System.out.println
并视为缺陷。
自:PMD 2.1
使用 System.(out|err).print,考虑使用记录器。
此规则由以下 XPath 表达式定义:
//Name[
starts-with(@Image, 'System.out.print')
or
starts-with(@Image, 'System.err.print')
]
你应该能够修改上面的 XPath 表达式来覆盖行为(虽然我不确定)下面的链接应该给你更多的洞察力,
http://pmd.sourceforge.net/pmd-4.2.6/rules/logging-java.html