Beim Schreiben von Software müssen Sie häufig eine Druckprotokollfunktion verwenden, mit der Sie das Problem debuggen und positionieren können. Javas native System.out.println () -Methode wird jedoch selten in der realen Projektentwicklung verwendet, und selbst Code -Checking -Tools wie FindBugs werden denken, dass die Verwendung von System.out.println () ein Fehler ist.
Warum ist System.out.println (), ein Anfänger -Artefakt von Java, in der realen Projektentwicklung verschmutzt sein? Solange Sie es sorgfältig analysieren, werden Sie viele Nachteile davon finden. Wenn es beispielsweise nicht kontrolliert wird, werden alle Protokolle nach dem Start des Projekts wie gewohnt gedruckt, wodurch die Betriebseffizienz verringert wird. Sie können unterscheiden, in welcher Kategorie dieses Protokoll gedruckt wird.
Ihr Anführer ist kein Dummkopf. Ihr Führer ist jedoch ziemlich gut und ermöglicht es Ihnen nicht, ein NIUBI -Protokoll -Tool mit verschiedenen Funktionen zu erreichen, die zu Beginn nur ein Protokoll -Tool benötigt, das die Druckstufe steuern kann.
Diese Nachfrage ist für Sie nicht schwierig.
Public class logutil {public Final in Debug = 0; System.out.println (msg);}} public void Info (String msg) {if (info> = Ebene) {System.out.println (msg);} public void ing msg) {if (Fehler> = Ebene) {System.out.println (msg);}}}
Drucken Sie das Protokoll durch diese Klasse und müssen nur die Ebene der Ebene steuern, um den Druckinhalt frei zu steuern. Zum Beispiel befindet sich das Projekt jetzt in der Entwicklungsphase, und das Level wird auf Debuggen gesetzt, sodass alle Protokollinformationen gedruckt werden. Wenn das Projekt online ist, können Sie das Level auf Informationen einstellen, damit Sie nur das Protokoll- und den oben genannten Stufeprotokolldruck sehen können. Wenn Sie nur das falsche Protokoll sehen möchten, können Sie das Level auf Fehler festlegen. Und wenn das von Ihnen entwickelte Projekt eine Client -Version ist, möchten Sie kein Protokoll drucken, Sie können das Level auf nichts setzen. Sie müssen nur beim Drucken anrufen:
New LogUtil ().
Sie können es kaum erwarten, dieses Tool Ihrem Anführer vorzustellen.
Aber es dauerte nicht lange, bis Ihr Anführer fand, dass Sie Feedback geben. Er sagte, dass dieses Tool einfach zu bedienen ist, aber jedes Mal, wenn Sie ein Protokoll drucken müssen, müssen Sie ein neues Logutil erstellen, was zu viel zu tun hat. Ich hoffe, Sie können dieses Tool ändern. Um es zu verwenden, um es zu verwenden.
Denken Sie, dass Ihr Anführer sehr vernünftig ist, und Sie versuchen, diese Gelegenheit zu nutzen, um den Designmodus zu üben Ich habe nicht darauf geachtet.
Öffentliche Klasse {private statische Logutil -Logutilinstanz; GetInstance () {if (logutilinstance == null) {logutilinstance = new LogUtil ();} return logutilinstance;} public void debug (String g. {If (debug> = stuf } Public void Info (String msg) {if (info> = stufe) {System.out.println (msg);} public void error (String msg) {if (error> = stufe) {System .out );}} Public static void main (String [] args) {logutil.getInstance ().
Erstens ist der Konstruktor des Logutil -Konstruktors privatisiert, so dass das neue Schlüsselwort nicht zum Erstellen einer Logutil -Instanz verwendet werden kann. Verwenden Sie dann eine private statische Slogutil -Variable, um die Instanz zu speichern, und geben Sie eine öffentliche GetInstance -Methode an, um eine Logutil -Instanz zu erhalten. Slogutil direkt. Dies kann sicherstellen, dass nur eine Instanz von Logutil im Speicher vorhanden ist. Der Einzelmodus ist abgeschlossen! Zu diesem Zeitpunkt muss der Code des Druckprotokolls in die folgende Weise geändert werden:
Logutil.getInstance ().
Sie zeigen diese Version Ihrem Anführer.
Sie sind voll von Verdacht. Ist der einzelne Beispiel -Modus nicht so realisiert? Was kann Fehler sein?
Ihr Anführer fordert Sie auf, dass die Verwendung eines Singles -Modus dazu besteht, dass diese Klasse nur eine Instanz im Speicher hat. Betrachten Sie jedoch die Situation des Druckprotokolls in Multi -Threaded? Wie im folgenden Code gezeigt:
Public static logutil getInstance () {if (logutilinstance == null) {logutilinstance = new LogUtil ();} return logutilinstance;}
Wenn gleichzeitig zwei Threads gleichzeitig die GetInstance -Methode ausführen, führt der erste Thread nur die zweite Zeile aus und hat die dritte Zeile noch nicht ausgeführt. Auf diese Weise schlägt Ihr Singles -Modus fehl, da zwei verschiedene Instanzen erstellt werden.
Sie erkennen plötzlich, aber Ihr Denken ist sehr schnell und Sie denken sofort an die Lösung.
Public synchronisierte statische logutil getInstance () {if (logutilinstance == null) {logutilinstance = new LogUtil ();} return LogUtilinStance;}
Auf diese Weise darf nur ein Thread gleichzeitig den Code in GetInstance ausführen, was die Situation, in der die beiden Instanzen oben erzeugt werden, effektiv löst.
Ihr Anführer liest Ihren neuen Code und sagte: "Nun, ja. Dies löst die Situation, die möglicherweise zwei Instanzen erzeugt, aber dieser Code ist immer noch ein Problem."
Sie sind nervös, warum gibt es irgendwelche Probleme?
Ihr Anführer lächelte: "Sei nicht nervös, diesmal ist es kein Fehler, aber es kann in Bezug auf die Leistung optimiert werden. Sehen Die Methode wird synchronisiert.
Entfernen Sie zuerst das synchronisierte Schlüsselwort aus der Methode -Anweisung und fügen Sie es dem Method -Körper hinzu:
Public static logutil getInstance () {if (logutilinstance == null) {synchronized (logutil.class) {if (logutilinstance == null) {// Es kann erforderlich sein Zeit gleichzeitig.
Nachdem der Code in dies geändert wurde, wird die dritte Zeile eingegeben, wenn der Slogutil nicht initialisiert wird, und dann das synchrone Schloss hinzugefügt. Sobald der Slogutil initialisiert ist, wird es nicht mehr in die dritte Zeile gelangen, so dass die GetInstance -Methode nicht durch Synchronisationsschlösser beeinflusst wird und die Effizienz bis zu einem gewissen Grad verbessert wird.
Sie können nicht anders, als zu bewundern.
Ihr Anführer wurde sofort bescheiden: "Diese Methode heißt Double-Check-Sperren, aber ich denke nicht daran. Sie können weitere Informationen im Internet überprüfen."
Tatsächlich bin ich eher daran gewöhnt, den Hungry Man -Modus in Java zu verwenden
Das Merkmal des faulen Stils ist eine verzögerte Belastung.
Das Merkmal des hungrigen Han -Stils ist, dass er am Anfang geladen wird, sodass Sie bei der Verwendung direkt zurückkehren können erwähnt, um das Synchronisationsproblem zu lösen)
Der Code der Implementierung von Protokolldatensätzen mit hungriger Han -Stil lautet wie folgt:
Öffentliche Klasse {private statische logutilinstance = neuer LogUtil () öffentliche int debug = 0; () {} Public static logutil getInstance () {return logutilinstance;} public void debug (String msg) {if (debug> = stufe) {system.out.print ln (msg);}} public void Info (String MSG) oder (String [] art) {logutil.getInstance ().