在system.out上,需要澄清

时间:2010-06-14 22:52:15

标签: java printstream

我正在看某人的代码并看到他多次宣布

PrintStream out = System.out;

后来被称为

out.println("blah");

我其实认为这有点整洁。这是一种常见做法吗?他只是喜欢?

9 个答案:

答案 0 :(得分:7)

这是一种合理的方法。他基本上是为System.out创建别名。有许多优点:

  • 少打字。
  • 以后更容易更改代码以输出到其他PrintStream。
  • 可能性能有所改善,但可以忽略不计。

答案 1 :(得分:3)

为避免在执行小型测试时(不使用IDE)特别键入System.out.println,我使用import static java.lang.System.out代替

但是,如果您想稍后替换System.out的值,或许可以将包装器重定向到文件

,那么这可能是有意义的。
 PrintStream out = new FilePrintStream("MyLogs.log"); // // System.out

立即静音标准输出。我重申 可能 在某些情况下有意义,因为我会使用Logging框架。

顺便说一下,最好将它声明为final和static:

class YourClass  {
    private final static PrintStream out = System.out;
}

答案 2 :(得分:1)

这可能是因为通常不建议深入研究并使用属于其他对象的对象。有人看到有人伸手去拿你的钱从钱包里拿钱,而不是要你借给他一些钱。

这可能会有一些优点,如果需要,可以将输出流更改为文件,套接字或其他任何内容。所以他能够取代:

PrintStream out = System.out;

PrintStream out = new PrintStream(new FileOutputStream(filename));

然而,如果他反复一再声明它,他实际上正在失去上述优势,因为重点是将它集中在一个地方并决定在一个地方输出日志的位置。

请注意,这是一种非常粗糙的方式,真正的标准做法是使用日志记录。 Java有自己的包java.util.logging开箱即用,log4j是另一个非常强大的替代品(并且非常受欢迎),还有其他的。

答案 3 :(得分:0)

这是一个快捷方式,如果你做了很多println.我之前已经看过它,但我倾向于不这样做,因为我觉得System.out.println更清楚,因为你没有需要弄清楚out的分配位置。我设置了一个eclipse模板,因此我可以将println自动填充到System.out.println,而且非常快。

答案 4 :(得分:0)

不。之前从未见过。

我同意。它不是太破旧......

答案 5 :(得分:0)

如果您查看文档中的Throwable.printStackTrace,您可以不带参数调用它,它只是将System.out传递给采用PrintStream的版本。

很常见的情况是可以传递许多不同的PrintStream对象并使打印代码更加简单。

答案 6 :(得分:0)

这是一个可爱的伎俩,但就像大多数可爱的技巧一样,做正确的事情可能会更好。

一旦你确定要记录日志(确实足以添加类似内容),为什么不让Log4J或其他一些具有更大灵活性和强大功能的日志系统呢?

如果你是独自一人,别名的东西很可爱又有趣,但即使你是一个非常慢的打字员,你每次输入它时都会节省5秒钟(通过System.out或"sysout +<ctrl-space>" in eclipse / netbeans),当你第一次看到“out out”时,你会失去十倍的时间。并且不知道它的意思。

我的意思是,在一个程序中,让我们说你做了其他海报建议的内容并重定向“out”转到文件而不是STDOUT但是在某些类中,也许“out”仍然转到System.out。或者你可能忘了你将它重定向到一个文件。后来你进来说“嗯,它说:

out.println("WE MADE IT");

但我在STDOUT中没有看到这一行,到底是什么?“

然后你花4个小时跟踪一个不良指示,而不是修复错误。

答案 7 :(得分:0)

这是否是一个好主意是有争议的,可能取决于具体情况。

好的一面:

  • 它使应用程序代码看起来更整洁。
  • 可以简化更改输出目的地。

在负面:

  • 它可能会增加交叉耦合;例如如果out变量是实例变量或必须作为参数传递。
  • 如果您的应用需要致电System.setOut(),则可能会造成麻烦。
  • 如果System.out代码只是调试,则会更难注意到并删除。实际上,它可能会使报告此类事情的PMD(等)代码质量检查无效。

应该指出的是,还有其他方法可以做到这一点;例如用实用方法System.out.println(String)替换printLine(String)可以在没有交叉耦合的情况下实现类似的效果。

答案 8 :(得分:0)

由于System.outfinal变量,他所做的与直接引用System.out相同。

除非有人致电System.setOut()并重新分配System.out

等等,什么?