LoggerFactory.getLogger(ClassName.class) vs LoggerFactory.getLogger(dies.getClass().getName())
Ich bin versucht zu verbessern mein-Optimierung Kenntnisse in Java. Um das zu erreichen, habe ich ein altes Programm, das ich gemacht und ich versuche mein bestes, um es besser zu machen. In diesem Programm bin ich mit SL4J für die Protokollierung. Um den logger habe ich:
private static final Logger logger = LoggerFactory.getLogger(this.getClass().getName());
Damals schrieb ich den code, ich dachte, dies sei die beste option, weil ich Entferne einen Verweis auf den Namen der Klasse(die möglicherweise umgestaltet werden). Aber jetzt bin ich nicht mehr so sicher...
private static final Logger logger = LoggerFactory.getLogger(ClassName.class);
Auf der anderen Seite, hält den Verweis auf den Namen der Klasse, aber es entfernt einen Methodenaufruf. Dies kann nicht eine große Verbesserung in der Leistung für eine Klasse, aber wenn Sie haben eine Menge Klasse, das kann was werden.
Also meine Frage ist:
Welcher Ansatz ist besser? Über den Namen der Klasse oder bekommen es durch Reflexion?
Bitte motivieren Sie Ihre Antwort mit pro und cons. Danke.
InformationsquelleAutor Aurasphere | 2015-11-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich werde teilen meine Meinung hier. Ich würde sagen, dass dies der Fall ist, dass Sie sollten nicht belästigt werden, von der performance-Sicht. Wahrscheinlich in dem code gibt es Teile, die optimiert werden können viel mehr als dieses Ding 🙂
Nun, zu Ihrer Frage. Werfen Sie einen Blick auf LoggerFactory ist code
Beachten Sie, dass
getLogger(Class<?> name)
nur ruft die überladene Methode:Und macht einige zusätzliche Berechnungen. Also die Methode mit der Schnur ist natürlich etwas schneller.
Im Allgemeinen das Muster aufrecht zu erhalten, Logger Referenz als ein statisches Feld in der Klasse, so etwas wie dieses:
In diesem Fall können Sie nicht wirklich nutzen
this.getClass()
weilthis
nicht tatsächlich existiert (man läuft in einen statischen Kontext).Aus meiner Erfahrung ist es besser, verwenden Sie die
ClassName.getClass()
als parameter, es sei denn, Sie wirklich wollen, verwenden Sie die gleiche logger von verschiedenen Klassen. In einem solchen Fall, verwenden Sie besser eine logische Konstante, bezeichnet die logger.Zum Beispiel, sagen wir, Sie versuchen, zu verwenden 3 verschiedene Klassen zum Zugriff auf die Datenbank.
So erstellen Sie logger 'DB', vergeben Sie einen Datei-appender, wird in Datenbank schreiben.anzumelden, und Sie möchten, verwenden Sie den gleichen logger unter diesen 3 verschiedenen Klassen.
So sollten Sie den folgenden code verwenden:
Hoffe, das hilft
InformationsquelleAutor Mark Bramnik
Was ich normalerweise tun ist
Jedoch das idiom
ist ebenso verbreitet. In dieser Frage finden Sie mehr info über diese Konventionen.
Der Vorteil der Verwendung von getClass() ist, dass wenn Sie sich in eine abstrakte Klasse, die Unterklassen, verwenden Sie es nicht machen Verweise auf den Namen der abstrakten Klasse,
InformationsquelleAutor francesco foresti
Ich lieber
Weil
Können Sie überschreiben, indem Sie eine Klasse Kinder, und Sie werden sehen, Kind, Klasse, name im Logbuch. Manchmal kann es verwirrend sein, da log tatsächlich durchgeführt wird, in der übergeordneten Klasse
InformationsquelleAutor D. Rakov
Späten Eintrag!
So, ich bin wahrscheinlich auf der Suche nach diesem in der Zukunft.
Es ist ein Weg, um copy/paste-freundlich-Logger-Instanzen (zugegeben, dies ist fast nie ein guter Grund, etwas zu tun!) durch die Verwendung von Java 7 ist MethodHandles Klasse.
InformationsquelleAutor Mark McLaren
Wenn Sie nicht möchten, schreiben Sie den Namen der Klasse jedes mal, wenn Sie erklären, einen logger verwenden, können Sie das folgende Dienstprogramm-Methode:
Kann die Methode verwendet werden, die tis-Weg:
Mit solch einem Ansatz, der logger Erklärung ist immer die gleiche für alle Klassen.
InformationsquelleAutor baronKarza
Ich diese
InformationsquelleAutor Somendra
Verwenden Sie diese
InformationsquelleAutor Nikhil