私は誰かのコードを見ていて、彼が繰り返し宣言しているのを見ました
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
そして、標準出力を一度に消音します。繰り返しますが、これにはロギングフレームワークを使用するため、一部のシナリオでは意味がある場合があります。
ところで、それを最終的で静的なものとして宣言する方が良いでしょう:
class YourClass {
private final static PrintStream out = System.out;
}
一般に、他のオブジェクトのメンバーであるオブジェクトを掘り下げて使用することは推奨されていないためである可能性があります。誰かがあなたにお金を貸してくれるように頼む代わりに、あなたの財布からあなたのお金を引き出すためにあなたのポケットに手を伸ばしているように見えます。
これには、必要に応じて出力ストリームをファイルやソケットなどに変更できるというわずかな利点があるかもしれません。したがって、彼は次のものを置き換えることができます。
PrintStream out = System.out;
と
PrintStream out = new PrintStream(new FileOutputStream(filename));
しかし、彼が何度も何度もそれを宣言している場合、彼は実際に上記の利点を失っています。なぜなら、それをどこかに集中させて、ログを1か所に出力する場所を決定することが重要だからです。
これは非常に大雑把な方法であり、実際の標準的な方法はロギングを使用することであることに注意してください。Javaには独自のパッケージjava.util.loggingがあり、log4jはもう1つの非常に強力な(そして非常に人気のある)代替手段であり、他にもあります。
System.out
は変数であるため、彼が行ったことは直接final
参照することと同じです。System.out
誰かがSystem.setOut()
どの再割り当てを呼び出しない限りSystem.out
。
待って、何?
これは、以前に多くの場所で行われたことを行っている場合のショートカットですが、割り当てられた場所を把握する必要がないため、より明確println.
だと思うので、行わない傾向があります。Eclipseテンプレートをセットアップして、オートコンプリートできるようにしました。これは非常に高速です。System.out.println
out
println
System.out.println
いいえ。これまで見たことがない。
同意します。ぼろぼろではありません...
ドキュメントでThrowable.printStackTraceを見ると、引数なしで呼び出すことができ、System.outをPrintStreamを使用するバージョンに渡すだけです。
さまざまなPrintStreamオブジェクトを渡すことができ、コードの印刷がはるかに簡単になる状況を見つけることは非常に一般的です。
それはかわいいトリックですが、ほとんどのかわいいトリックのように、それを正しく行う方が良いかもしれません。
ロギングが必要であると確信できるようになったら(そのようなものを追加するのに十分です)、Log4Jまたはさらに柔軟性とパワーを備えた他のロギングシステムを入手してみませんか?
エイリアシングは、一人でいるとかわいくて楽しいですが、タイピストが本当に遅い場合でも、入力するたびに(System.outまたは"sysout +<ctrl-space>"
eclipse / netbeansで) 5秒節約できます。その時間は、誰か(おそらくあなた)が初めて「外」を見たときの10倍です。そしてそれが何を意味するのかすぐにはわかりません。
つまり、あるプログラムでは、他のポスターが提案したことを実行し、「out」をリダイレクトしてSTDOUTではなくファイルに移動したとしましょう。ただし、一部のクラスでは、「out」はまだSystem.outに移動します。または、ファイルにリダイレクトしたことを忘れただけかもしれません。後であなたは入って来て、「まあ、それは言う:
out.println("WE MADE IT");
しかし、私はSTDOUTにその行が表示されません、一体何ですか?」
次に、バグを修正する代わりに、悪い兆候を追跡するために4時間を費やします。
これが良い考えであるかどうかは議論の余地があり、おそらく状況に依存します。
プラス面:
マイナス面:
out
変数がインスタンス変数である場合、またはパラメータとして渡す必要がある場合。System.setOut()
。これを行う方法は他にもある可能性があることに注意してください。System.out.println(String)
たとえば、ユーティリティメソッドに置き換えるとprintLine(String)
、クロスカップリングなしで同様の効果が得られます。