告诉javac忽略System.out.println()

时间:2014-07-09 14:59:39

标签: java javac

我在编程时使用System.out.println()(sout)进行调试和一般状态概述(这对网络内容特别有用)。既然我希望我的代码在最后有效,有没有办法告诉java编译器忽略souts?

我已经尝试了一些谷歌搜索,但解决方案非常不满意,比如将所有的声音放在带有全局变量的if中。 (如果需要大量的消息,那么行数增加三倍并使代码变得非常难以理解)

任何人都知道是否存在这样的编译器选项(如果不存在,为什么不存在?),或者如果还有其他更优雅的解决方案,那么上面提到的那个。谢谢你的答案:)

2 个答案:

答案 0 :(得分:4)

使用logging。您可以指示通常不会显示的日志级别,并且可以显示日志记录属性。这可以通过控制等方式完成。

Logger.getLogger(getClass().getName()).log(Level.FINE, "...");

实际上,日志记录有很多示例和方面。因此,如果您希望您的代码简约而成熟,请使用日志记录。

另一种方法是使用单元测试,并且不在生产代码中输出。这需要更严格,并允许查找回归错误。

第三种选择是更自由地使用(未选中)例外,IllegalArgumentException,IllegalStateException。提供信息快速失败。

答案 1 :(得分:3)

首先,我想说这个问题的真正答案是使用其他人已经显示的日志框架。

但是如果您致力于使用System.out,您仍然可以达到预期的效果。在下面的类中,我将System.out(通过使用System.setOut方法)更改为另一个实际上不打印任何内容的PrintStream。

import java.io.*;

    class Sys
    {
        public static void main ( String [ ] args ){
        System.setOut(new PrintStream(new OutputStream(){
            @Override
                public void write(int b){
            }
            }));
        System.out.println("Hello World!");
        }
    }

我的答案可以改进。例如,它仍然会将对象转换为字符串以进行打印,但您可以通过设置一个完全没有任何内容的覆盖PrintStream类来解决这个问题。

但是你对它的改进越多,你就越多地实现了其他人已经完成的日志记录实用程序。这就是为什么我建议记录是真正的答案。