7

我在看某人的代码,看到他反复声明

PrintStream out = System.out;

后来打电话

out.println("blah");

我实际上认为这很整洁。这是一种常见的做法吗?他只是看中了吗?

4

9 回答 9

7

这是一种合理的做法。他基本上是在为System.out. 有许多优点:

  • 少打字。
  • 以后更容易更改代码以输出到不同的 PrintStream。
  • 可能会提高性能,尽管它可以忽略不计。
于 2010-06-14T22:57:08.570 回答
3

为了避免System.out.println在执行小测试(没有 IDE)时专门输入,我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;
}
于 2010-06-14T23:11:47.743 回答
1

这可能是因为通常不建议深入研究和使用属于其他对象的对象。这看起来就像有人伸手从你的口袋里拿出你的钱,而不是要求你借钱给他。

这样做可能有一点好处,那就是能够在需要时将输出流更改为文件、套接字或其他任何东西。所以他可以替换:

PrintStream out = System.out;

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

但是,如果他一遍又一遍地声明它,他就真的失去了上述优势,因为重点是将它集中在某个地方,并决定在哪里输出日志。

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

于 2010-06-15T07:08:12.717 回答
0

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

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

于 2010-06-14T23:17:32.870 回答
0

这是一个可爱的把戏,但就像大多数可爱的把戏一样,把它做好可能会更好。

一旦确定要进行日志记录(肯定可以添加类似的内容),为什么不直接使用 Log4J 或其他具有更大灵活性和功能的日志记录系统呢?

如果你一个人的话,别名是一种可爱和有趣的东西,但即使你是一个非常慢的打字员并且每次输入它(通过 System.out 或"sysout +<ctrl-space>"在 eclipse/netbeans 中)它会为你节省整整 5 秒,你也会输那个时候是第一次有人——可能是你——看到“out”的十倍。并且不立即知道这意味着什么。

我的意思是,在一个程序中,假设您执行了其他海报建议的操作,并将“out”重定向到文件而不是 STDOUT,但在某些类中,“out”可能仍会转到 System.out。或者您可能只是忘记了将其重定向到文件。后来你进来说“好吧,它说:

out.println("WE MADE IT");

但我在 STDOUT 中看不到那条线,到底是什么?”

然后,您花费 4 个小时来跟踪错误指示,而不是修复错误。

于 2010-06-14T23:43:27.170 回答
0

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

从积极的一面:

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

不利的一面:

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

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

于 2010-06-15T01:38:28.550 回答
0

如果您正在做很多事情,这是一条捷径,println.我以前在某些地方已经看过它,尽管我倾向于不这样做,因为我认为System.out.println更清楚,因为您不需要弄清楚out分配的位置。我设置了一个 Eclipse 模板,这样我就可以自动完成printlnSystem.out.println而且速度非常快。

于 2010-06-14T22:54:14.480 回答
0

没有。以前从未见过。

我同意。也不算太破旧...

于 2010-06-14T22:54:49.877 回答
0

因为System.out是一个final变量,他所做的将与System.out直接引用相同。

除非有人打电话System.setOut()给重新分配System.out

等等,什么?

于 2010-06-15T02:00:42.363 回答