我有这个Checkstyle块来阻止人们在我的项目中打印到控制台:
<module name="Regexp">
<property name="format" value="((System\.|(out|err)\.print)|printStackTrace)"/>
<property name="ignoreComments" value="true"/>
<property name="illegalPattern" value="true"/>
<property name="message" value="No printing to console, use a logger."/>
</module>
正则表达式为((System\.|(out|err)\.print)|printStackTrace)
但是,有人偷偷将其插入:out.println
通过导入import static java.lang.System.out;
。
因此我将正则表达式更新为:((System\.(out|err))|printStackTrace|(out|err)\.(print|write|append))
我的问题是:此正则表达式涵盖了所有以Java打印到控制台的方式吗?有人在Checkstyle中使用更好的正则表达式吗?
答案 0 :(得分:0)
如果您不希望人们使用System.out.println
,那么您最好的办法就是说他们的工作处于危险之中,并采取其他对策来威胁他们。 (请,我在开玩笑,永远不要这样做):)
他们可以做类似的事情
import static java.lang.System.out;
public class App
{
public interface wvs {
void abc(Object o);
}
static final wvs bwz = out::println; /* this is the only reference to
* println, but you can hide it
* in another part of the
* application */
static void blah(wvs o, Object oo)
{
o.abc( oo );
}
public static void main( String[] args )
{
System.out.println( "Hello World!" ); /* this will be filtered */
blah(bwz, "another message by courtesy of LC"); /* will this? */
}
}
,让您发疯地寻找对System.out.println()
的呼叫。您甚至可以编写Logger
类来绕过Logger
配置打印到控制台。 :)
作为提示,永远不要试图用武力证明人类的智慧,否则就会迷失。作为一名好经理,请尝试说服您的员工按预期方式行事。让他们相信使用Loggers的好处,但是千万不要用蛮力尝试。
如果一个月内您的应用程序没有控制台输出,请尝试向他们免费提供啤酒。这几乎总是可行的。