ソフトウェアを作成するときは、プロジェクトが起動した後にデバッグして配置するのに役立つ印刷ログ機能を使用する必要があります。しかし、JavaのネイティブSystem.out.println()メソッドは、実際のプロジェクト開発ではほとんど使用されず、FindBugsなどのコードチェックツールでさえ、System.out.println()を使用することはバグであると考えます。
System.out.println()は、Javaの初心者のアーティファクトであるのはなぜですか?実際、慎重に分析する限り、多くの不利な点が見つかります。たとえば、プロジェクトが起動した後、すべてのログが通常どおり印刷され、それによって操作効率が低下しますこのログが印刷されているカテゴリを区別します。
あなたのリーダーは愚か者ではありません。ただし、リーダーはかなり優れており、最初はさまざまな機能を備えたNiubiログツールを実現することはできません。
この需要はあなたにとって難しくありません。
Public Class logutil {debug = 0; System.out.println(msg);}} public void info(string msg){if(info> = level){system.out.println(msg);} public void ing msg){if(error> = level) {system.out.println(msg);}}}
このクラスを介してログを印刷し、印刷コンテンツを自由に制御するためにレベルのレベルを制御する必要があります。たとえば、プロジェクトは現在開発段階にあり、レベルがデバッグに設定されているため、すべてのログ情報が印刷されます。プロジェクトがオンラインである場合、レベルを情報に設定して、ログと上記のレベルのログ印刷のみを見ることができます。間違ったログを表示したい場合は、レベルをエラーに設定できます。また、開発したプロジェクトがクライアントバージョンである場合、ログを印刷したくない場合は、レベルを何も設定できません。印刷するときに電話する必要があります。
new logutil()。
あなたのリーダーにこのツールを紹介するのが待ちきれません。
しかし、あなたのリーダーがあなたがフィードバックを与えるのにあなたを見つけるのにそれほど時間はかかりませんでした。彼は、このツールは使いやすいが、ログを印刷するたびに、新しいLogutilを作成する必要があると述べたそれを使用してシングルモードの実装。
あなたはあなたのリーダーが非常に合理的であると思いますか、そしてあなたはこの機会を利用して設計モードを練習しようとしているので、あなたは次のコードを書きました(PS:ここのコードは自分で行われ、私は注意を払っていませんでしたそれに注意を払っていません。
Public Class Logutil {Public Final Int = 1 getInstance(){if(logutilInstance == null){logutilinstance = new logutil();} return logutilinstance;} public void debug(string g。{if(debug> = level){system.out.println(msg);} } public void info(string msg){if(info> = level){system.out.println(msg);} public void error(string msg){if(error> = revel){system .out(msg );}} public static void main(string [] args){logutil.getInstance( "Hello World!");}}
まず第一に、Logutilのコンストラクターは民営化されているため、新しいキーワードを使用してLogutilインスタンスを作成できません。次に、Slogutil Private Static変数を使用してインスタンスを保存し、この方法でPublic GetInstanceメソッドを提供して、Slogutilが空である場合、新しいLogutilインスタンスが利用可能であると判断されます。直接slogutil。これにより、メモリにlogutilのインスタンスのみがあることが保証されます。シングルモードが完了しました!この時点で、印刷ログのコードを次の方法に変更する必要があります。
logutil.getInstance()。
あなたはあなたのリーダーにこのバージョンを見て、彼はそれを見た後、「これは単一の例のようですが、まだバグがあります。
あなたは疑いに満ちています、シングルエクサムモードはこのように実現していませんか?バグとは何ですか?
あなたのリーダーは、シングルモードを使用することは、このクラスにメモリに1つのインスタンスしか持たないようにすることを促しますが、マルチスレッドのログを印刷する状況を考慮していますか?次のコードに示されているように:
public static logutil getInstance(){if(logutilinstance == null){logutilinstance = new logutil();} return logutilinstance;}
GetInstanceメソッドを同時に実行すると同時に2つのスレッドがある場合、最初のスレッドは2番目の行を実行するだけで、この時点ではIF判断を実行していません。このようにして、2つの異なるインスタンスが作成されるため、シングルモードは失敗します。
あなたは突然気づきますが、あなたの考えは非常に速いので、すぐに解決策を考えます。
public synchronized static logutil getInstance(){if(logutilinstance == null){logutilinstance = new logutil();} return logutilinstance;}
このようにして、GetInstanceでコードを同時に実行できるスレッドは1つだけで、2つのインスタンスが上記の状況を効果的に解決します。
あなたのリーダーはあなたの新しいコードを読み、「まあ、はい。これは2つのインスタンスを作成する可能性のある状況を解決しますが、このコードはまだ問題です。」
あなたは緊張しています、なぜ何か問題があるのですか?
あなたのリーダーは微笑んだ:「緊張しないでください、今回はバグではありませんが、それはパフォーマンスの点で最適化できます。方法、ロックの効果は実際には、Logutilインスタンスを作成するときに同期ロックを追加します。
まず、メソッドステートメントから同期されたキーワードを削除し、メソッドボディに追加します。
public static logutil getInstance(){if(logutilInstance == null){synchronized(logutil.class){if(logutilinstance == null){// 2つのプロセスが同時に添付される可能性があるため、必要になる場合があります。同時に時間。
コードがこれに変更された後、Slogutilが初期化されないときに3行目に入り、同期ロックを追加します。 Slogutilが初期化されるとすぐに、Getinstanceメソッドが同期ロックの影響を受けることなく、効率がある程度改善されるように、3行目に移動しなくなります。
この方法は本当に賢いです。
あなたのリーダーはすぐに謙虚になりました。
実際、私はJavaで空腹の男モードを使用することに慣れています
怠zyなスタイルの特性は、荷重が遅れています。
空腹のハンスタイルの特徴は、最初にロードされていることです。そのため、使用すると直接戻ることができます(これをもう1つお勧めします。同期の問題を解決するために言及されています)
空腹のハンスタイルでログレコードを実装するコードは次のとおりです。
Public Class logutiling = new logutil() (){} public static logutil getInstance(){return logutilinstance;} public void debug(string msg){if(debug> = level){system.out.print ln(msg);}} public void info(string msg)} {if(info> = level){system.out.println(msg);}} public void error(string msg){if(error> = level){system.out.println(msg);} public atic void main main (string [] art){logutil.getInstance()。