我在看某人的代码,看到他反复声明
PrintStream out = System.out;
后来打电话
out.println("blah");
我实际上认为这很整洁。这是一种常见的做法吗?他只是看中了吗?
我在看某人的代码,看到他反复声明
PrintStream out = System.out;
后来打电话
out.println("blah");
我实际上认为这很整洁。这是一种常见的做法吗?他只是看中了吗?
这是一种合理的做法。他基本上是在为System.out
. 有许多优点:
为了避免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;
}
这可能是因为通常不建议深入研究和使用属于其他对象的对象。这看起来就像有人伸手从你的口袋里拿出你的钱,而不是要求你借钱给他。
这样做可能有一点好处,那就是能够在需要时将输出流更改为文件、套接字或其他任何东西。所以他可以替换:
PrintStream out = System.out;
和
PrintStream out = new PrintStream(new FileOutputStream(filename));
但是,如果他一遍又一遍地声明它,他就真的失去了上述优势,因为重点是将它集中在某个地方,并决定在哪里输出日志。
请注意,这是一种非常粗略的方法,真正的标准做法是使用日志记录。Java 有自己的包 java.util.logging 开箱即用,log4j 是另一个非常强大的替代方案(并且非常流行),还有其他的。
如果您查看文档中的 Throwable.printStackTrace,您可以不带参数调用它,它只是将 System.out 传递给采用 PrintStream 的版本。
发现可以传递许多不同的 PrintStream 对象的情况很常见,它使打印代码更加简单。
这是一个可爱的把戏,但就像大多数可爱的把戏一样,把它做好可能会更好。
一旦确定要进行日志记录(肯定可以添加类似的内容),为什么不直接使用 Log4J 或其他具有更大灵活性和功能的日志记录系统呢?
如果你一个人的话,别名是一种可爱和有趣的东西,但即使你是一个非常慢的打字员并且每次输入它(通过 System.out 或"sysout +<ctrl-space>"
在 eclipse/netbeans 中)它会为你节省整整 5 秒,你也会输那个时候是第一次有人——可能是你——看到“out”的十倍。并且不立即知道这意味着什么。
我的意思是,在一个程序中,假设您执行了其他海报建议的操作,并将“out”重定向到文件而不是 STDOUT,但在某些类中,“out”可能仍会转到 System.out。或者您可能只是忘记了将其重定向到文件。后来你进来说“好吧,它说:
out.println("WE MADE IT");
但我在 STDOUT 中看不到那条线,到底是什么?”
然后,您花费 4 个小时来跟踪错误指示,而不是修复错误。
这是否是一个好主意是有争议的,并且可能取决于具体情况。
从积极的一面:
不利的一面:
out
变量是实例变量或必须作为参数传递。System.setOut()
.应该注意的是,可能还有其他方法可以做到这一点;例如System.out.println(String)
,用实用方法替换printLine(String)
可以在没有交叉耦合的情况下实现类似的效果。
如果您正在做很多事情,这是一条捷径,println.
我以前在某些地方已经看过它,尽管我倾向于不这样做,因为我认为System.out.println
更清楚,因为您不需要弄清楚out
分配的位置。我设置了一个 Eclipse 模板,这样我就可以自动完成println
,System.out.println
而且速度非常快。
没有。以前从未见过。
我同意。也不算太破旧...
因为System.out
是一个final
变量,他所做的将与System.out
直接引用相同。
除非有人打电话System.setOut()
给重新分配System.out
。
等等,什么?