PrintStream out = System.out;
后来被称为
out.println("blah");
我认为这很有意思。这是一种常见的做法吗?他只是想要炫耀吗?
PrintStream out = System.out;
后来被称为
out.println("blah");
我认为这很有意思。这是一种常见的做法吗?他只是想要炫耀吗?
这是一个合理的方法。他基本上为System.out
创建了一个别名。有许多优点:
System.out.println
,我使用import static java.lang.System.out
代替。System.out
的值,例如将其替换为一个包装器以重定向到文件,则这可能是有意义的。 PrintStream out = new FilePrintStream("MyLogs.log"); // // System.out
立即将标准输出静音。我再说一遍,这在某些情况下可能有意义,因为为此我会使用一个日志框架。
顺便说一句,最好也声明为final和static:
class YourClass {
private final static PrintStream out = System.out;
}
这可能是因为通常不建议深入使用其他对象的成员对象。这就像有人伸手进你的口袋从你的钱包里拿钱,而不是向你借一些钱。
这样做可能会有轻微的优势,即能够在需要时更改输出流到文件、套接字或其他位置。因此,他将能够替换:
PrintStream out = System.out;
使用
PrintStream out = new PrintStream(new FileOutputStream(filename));
然而,如果他一遍又一遍地重复声明它,那么他真正失去了上述优势,因为整个重点是将其集中在某个地方,并决定在一个地方输出日志。
请注意,这是一种非常粗糙的方法,真正的标准做法是使用日志记录。Java有自己的包java.util.logging,log4j是另一个非常强大的选择(也非常流行),还有其他选择。
这是一个有趣的技巧,但像大多数有趣的技巧一样,最好还是做正确的事情。
一旦你确定你需要日志记录(足够确定以添加类似内容),为什么不直接使用Log4J或其他具有更高灵活性和功能的日志记录系统呢?
给东西起别名可能很有趣,如果你独自一人的话,但即使你打字速度非常慢,每次输入它可以节省你整整5秒钟(相对于在eclipse / netbeans中使用System.out或“sysout +<ctrl-space>”),但第一次有人(也许是你)看到“out”时并不知道它的含义,你将会浪费十倍的时间。
我的意思是,在一个程序中,假设你按照其他帖子的建议重定向“out”以将其发送到文件而不是STDOUT,但在某些类中,“out”仍然会发送到System.out。或者你只是忘记了将其重定向到文件。后来你回来看,说:“嗯,它说:
out.println("WE MADE IT");
但是我在STDOUT中没有看到那行代码,这是怎么回事?
然后你花了4个小时去追踪错误的指示而不是修复bug。
如果你需要频繁使用println
,那么这是一个快捷方式。我之前在一些地方看到过这样的做法,但我不太喜欢这样做,因为我认为System.out.println
更清晰,因为你不需要找出out
被分配到了哪里。我设置了一个Eclipse模板,这样我就可以自动完成println
到System.out.println
的转换,速度非常快。
没有。我以前从未见过。
我同意。这还不错...
如果您查看文档中的Throwable.printStackTrace,您可以在不带参数的情况下调用它,并将System.out传递给需要PrintStream的版本。
在许多不同的PrintStream对象可能被传递的情况下,这是非常常见的,它使打印代码变得更加简单。
这是否是一个好主意存在争议,可能取决于具体情况。
优点:
缺点:
out
变量是实例变量或必须作为参数传递。System.setOut()
,可能会引起麻烦。值得注意的是,还有其他潜在方法可以实现这一点;例如,将System.out.println(String)
替换为实用程序方法printLine(String)
可以在不产生交叉耦合的情况下实现类似的效果。
由于System.out
是一个final
变量,他所做的与直接引用System.out
是相同的。
除非有人调用了System.setOut()
重新分配了System.out
。
等等,什么?
import static java.lang.System.out;
声明。 - ILMTitan