当我运行我的PMD插件时,他们说System.out.println
已被使用。为什么System.out.println
使用不好,使用PMD插件时是否有缺陷?什么是超越这个的替代方式?
答案 0 :(得分:6)
可以使用配置打开/关闭记录器,但不能使用System.out.println
。重要的是,记录器提供不同级别的日志记录,并且可以通过配置文件再次进行控制。
同样使用记录器,您可以配置旋转,清除等但不能对sysout执行相同操作。这在生产环境中很常用,执行大量代码并生成大量日志记录。
答案 1 :(得分:4)
System.out.println ..
通常用于调试目的,可以保留在 代码库甚至在生产代码中。通过使用记录器可以 随意启用/禁用此行为(并按优先级)并避免 堵塞标准输出日志。
(来自SourceMeter Java user guide“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");
}
}
答案 2 :(得分:2)
System.out.println()
被视为记录的不良做法
因为
ON
/ OFF
)TRACE
,DEBUG
,INFO
,WARN
,ERROR
),另一个缺点是程序的标准输出可以被重定向,例如,并不总是清楚输出实际到达的位置,例如,如果你这样做:
java SomeClass > someFile
在这种情况下,使用日志API将对您有所帮助。
但是在某些情况下你真的想要将某些内容打印到标准输出上,因为有java.io.Console
的情况无法重定向,所以如果你正在运行命令行java程序,它会给出你相信用户正在看到他们想要的消息。
答案 3 :(得分:1)
这是因为,PMD定义了一个名为SystemPrintln
的java日志记录规则,它在代码中检测System.out.println
并将其视为缺陷。
自:PMD 2.1
使用系统。(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
答案 4 :(得分:0)
将过量的数据打印到System.out可能会成为性能瓶颈,因为它是同步的,来自PrintStream的代码:
public void println(float x) {
synchronized (this) {
print(x);
newLine();
}
}