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

そして、標準出力を一度に消音します。繰り返しますが、これにはロギングフレームワークを使用するため、一部のシナリオでは意味がある場合があります。

ところで、それを最終的で静的なものとして宣言する方が良いでしょう:

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));

しかし、彼が何度も何度もそれを宣言している場合、彼は実際に上記の利点を失っています。なぜなら、それをどこかに集中させて、ログを1か所に出力する場所を決定することが重要だからです。

これは非常に大雑把な方法であり、実際の標準的な方法はロギングを使用することであることに注意してください。Javaには独自のパッケージjava.util.loggingがあり、log4jはもう1つの非常に強力な(そして非常に人気のある)代替手段であり、他にもあります。

于 2010-06-15T07:08:12.717 に答える
0

System.outは変数であるため、彼が行ったことは直接final参照することと同じです。System.out

誰かがSystem.setOut()どの再割り当てを呼び出しない限りSystem.out

待って、何?

于 2010-06-15T02:00:42.363 に答える
0

これは、以前に多くの場所で行われたことを行っている場合のショートカットですが、割り当てられた場所を把握する必要がないため、より明確println.だと思うので、行わない傾向があります。Eclipseテンプレートをセットアップして、オートコンプリートできるようにしました。これは非常に高速です。System.out.printlnoutprintlnSystem.out.println

于 2010-06-14T22:54:14.480 に答える
0

いいえ。これまで見たことがない。

同意します。ぼろぼろではありません...

于 2010-06-14T22:54:49.877 に答える
0

ドキュメントでThrowable.printStackTraceを見ると、引数なしで呼び出すことができ、System.outをPrintStreamを使用するバージョンに渡すだけです。

さまざまなPrintStreamオブジェクトを渡すことができ、コードの印刷がはるかに簡単になる状況を見つけることは非常に一般的です。

于 2010-06-14T23:17:32.870 に答える
0

それはかわいいトリックですが、ほとんどのかわいいトリックのように、それを正しく行う方が良いかもしれません。

ロギングが必要であると確信できるようになったら(そのようなものを追加するのに十分です)、Log4Jまたはさらに柔軟性とパワーを備えた他のロギングシステムを入手してみませんか?

エイリアシングは、一人でいるとかわいくて楽しいですが、タイピストが本当に遅い場合でも、入力するたびに(System.outまたは"sysout +<ctrl-space>"eclipse / netbeansで) 5秒節約できます。その時間は、誰か(おそらくあなた)が初めて「外」を見たときの10倍です。そしてそれが何を意味するのかすぐにはわかりません。

つまり、あるプログラムでは、他のポスターが提案したことを実行し、「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 に答える