もちろん、エラーメッセージや警告にログフレームワークを使用することは非常に有効です。しかし、短時間で何か新しいことを試したい場合は、System.out.println()を使用することがあります。
System.out.println()をいくつかの簡単なテストに使用するのは本当に悪いですか?
コメントで明らかになったように、尋ねられている本当の質問は、なぜ静的コード分析ツールはSystem.out.printlnの使用にフラグを立てるのですか?
その理由は、stdoutへのメッセージの送信は、通常、実稼働環境では不適切であるためです。ライブラリをコーディングしている場合、ライブラリはstdoutに出力するのではなく、呼び出し元に情報を返す必要があります。 GUIアプリをコーディングしている場合は、stdoutが指している場所(どこにもない可能性がある)ではなく、ユーザーに情報を提示する必要があります。サーバー(またはサーバー側コンテナーで実行されるもの)をコーディングする場合は、フレームワークが提供するログ機能を使用する必要があります。などなど。
しかし、printlnをデバッグまたは開発に使用している場合、またはプログラムを作成してstdinを読み取り、stdoutに書き込む場合、printlnは完全に問題ありません。このようなケースでは、何も問題はありません。
すべてのstdout
はバッファリングされるため、プログラムがクラッシュするのは可能後呼び出したprintln()
、ただしbefore画面に到達します。
そうは言っても、このシナリオは本当にありそうもありません。先に進んで使用してください。ただし、マイナーな制限を覚えておいてください。
System.out
はラップされたBufferedOutputStream
です。これはおそらく、使用するロギングフレームワークに似ています。フレームワークは、ログ出力の構成および宛先の形式でより多くの機能を提供するだけです。
重要なプログラムに取り組んでいて、
使い捨てのコードであっても、_System.out
_の使用に関していくつかの注意点があります。
大きな問題の1つは、通常遅いことです。たとえば、いくつかのコードの速度について大まかなアイデアを取得しようとしている場合( (microbenchmarks is hard であることに注意))、単一のSystem.out.println()
を追加すると、どこでも本当に混乱する可能性がありますタイミング(同期中であり、実際の出力がユーザーに表示されるのを返す前に待機することが多いため)。
それ以外は、使い捨てコードではあまり心配しません。あなたがそれをコミットするつもりなら(それを本番コードまたはテストコードとして)、それを取り除き、それを適切なロギング呼び出しに置き換えてください(はい、eveninテストコード)。
よくあることですが、答えは「依存する」です。アプリケーションにすでにロギングフレームワークが配置されている場合は、それを使用することもできます。 lessはprintln()
に対応できません。また、スタックトレース、追加のコンテキスト、より適切なフォーマットなど、それが提供する他の機能を利用できます。また、ログフレームワークがより優れたエラー回復を提供し、致命的な障害が発生した場合でもログが正常に書き込まれることを確実にする可能性もあります。
したがって、最初にログシステムを追加するタイミングが問題になります。これは判断の呼びかけです。早急に追加する必要はありません。本当に必要がないことを確認するためだけです。また、追加を遅らせたくなく、アドホックソリューションからの変換作業が多すぎます。
println()
を使用して多くのログを記録していることが判明した場合、コードベースは、問題が増大していることを伝えようとしています。その時点で、適切なロギングに投資する価値はあります。
System.out.printが「システムデフォルト」コードページを使用するという問題がよくあります。これはLinuxでは多くの場合UTF-8ですが、WindowsではいくつかのMSの機能が壊れています。
これにより、プログラムの実行場所によっては、Unicode文字が画面に正しく印刷されるか、または正しく印刷されない可能性があります。
したがって、私はSystem.outよりもカスタムのPrintWriterを好みます
全然悪くない。この概念は、非常に単純であり、アプリケーションで専用のロギングフレームワークを使用するほど洗練されていないという事実から生じている可能性があります。
ただし、これが無効なアプローチであると言っているのではありません。私は何度かそれを使用して、アプリケーションのフローをチェックした後、いくつかのblack magic voodooプログラミングhijinksをチェックしました。
私が見るように、時々起こるSystem.out.printlnの最大の問題は、それが「悪い習慣の匂い(tm)」であるということです。自分でこれを実行している場合は、お気に入りのデバッガーを使用してより快適になることで、有効性を向上させることができます。
また、デバッガーを使用すると、ブレークポイントが本番コードに挿入されないのは確かですが、System.out.printlnはそうなる可能性があります。
余談ですが、実際にクイックテストを行っているだけで、デバッガーを使用しない場合は、ロギングフレームワークを使用するよりもSystem.out.printlnの方が適していると思います。終了すると、根絶するのが難しくなります。
内部状態の内容をエコーすることに関するテスト戦略全体を構築することは最も賢明な方法ではありませんが、開発中のコードの迅速でダーティーなテストでは、奇妙なprintlnがここにあり、削除することを覚えている限り問題はありません!
それらを削除するのを忘れることの危険性はおそらくそれが反対されている理由です。