我们有一个巨大的(旧的遗留Java)代码库,其中许多文件(大约5k)都有System.out.println.我们计划因清理/性能原因删除它们.我们如何编写一个脚本来替换它们而不会在代码中引入任何问题?脚本不能盲目删除它们,因为以下情况可能是一个问题:
if () some.code... else System.out.println(...); DB.close();
我想用';'代替它们.这将照顾上述情况.你还有其他问题吗?还有其他建议吗?
你考虑过这个愚蠢的案子:
System.out.println(" Print " + object.changeState() );
我认为它不会发生但是偶然的机会是println执行的方法实际上正在执行一些系统所依赖的操作并且可能会引入微妙的错误(相信我或不相信,但我亲眼目睹了这一点)
可能会用记录器替换并禁用记录器.
或者使用NullObject模式创建一个null对象:
public final class DevNull { public final static PrintStream out = new PrintStream(new OutputStream() { public void close() {} public void flush() {} public void write(byte[] b) {} public void write(byte[] b, int off, int len) {} public void write(int b) {} } ); }
并取代
System.out.println();
同
DevNull.out.println();
Log4E是一个带有"Replace System.out.println()"功能的eclipse插件.它会愉快地将所有那些讨厌的println调用转换为log4j调用.它甚至会用日志级别检查来包装它们.
扩展奥斯卡的概念,你可以做得更好恕我直言:
if(!DEBUG) { System.setOut( new PrintStream(new OutputStream() { public void close() {} public void flush() {} public void write(byte[] b) {} public void write(byte[] b, int off, int len) {} public void write(int b) {} } ); } }
在这种情况下,如果您没有处于调试模式或任何其他模式,则默认系统输出将在内部使用devNull实现替换,否则它将按预期工作.这样您就不必在代码中查找和替换任何内容.
您可以从调用Systems.setOut开始,然后传入您自己的OutputStream,它什么都不做.这将有助于您了解是否有性能提升.这比删除它更安全(因为Oscar指出 - 由副作用编码).如果性能提升可以忽略不计,那么您可能希望将工作重点放在其他地方.
我上面的方法有两个问题:
你想保留的任何System.out.printlns也会消失
字符串连接仍然会发生(这可能很昂贵,具体取决于有多少)
但是,如果您获得所需的性能提升,这是一个很好的快速测试.