Wiadomość nie odnosi się do kosztu konkatenacji String sama w sobie. Inne odpowiedzi są absolutnie poprawne, gdy mówią, że zostanie użyty StringBuilder.
Głównym powodem używania szablonu wiadomości jest to, że przetwarzanie odbywa się tylko wtedy, gdy wyświetlany jest poziom rejestrowania!
Użyjmy te dwa przykłady:
srcLogger.getLogger().log(Level.INFO,"UploadBean.doUpload completado [" + file.getName() + "]\n");
srcLogger.getLogger().log(Level.INFO, "UploadBean.doUpload completado [{0}]\n", file.getName());
Z debugowania Poziom Informacje o: Obie mają dostać nazwę pliku z pliku, oba muszą zaktualizować ciąg, generuje nowy, wyświetlić go.
Z poziomem debugowania INFO off: Druga odpowiedź przechodzi przez nazwę obiektu File (który jest prostym zapytaniem), metoda log() sprawdza poziom INFO i natychmiast zwraca. W ogóle nie jest wykonywane przetwarzanie!
Teraz wyobraźmy sobie, że zamiast zwykłego file.getName()
rejestrowaliśmy bardziej złożony obiekt, który sam w sobie wymaga dużej ilości łączenia ciągów w metodzie toString()
. Logując te obiekty bezpośrednio, żadne przetwarzanie nie jest w ogóle wykonywane. toString()
nigdy nie jest wywoływany, chyba że wyświetlany jest poziom debugowania.
Szablon wiadomości nie jest bardziej wydajny w przypadku, gdy rejestrowanie jest wyświetlane, ale jest znacznie bardziej efektywny (szczególnie w przypadku nietrywialnego rejestrowania), gdy rejestrowanie nie jest wyświetlane. Jednym z celów rejestrowania powinno być to, że jeśli rejestrowanie jest wyłączone, ma najmniejszy możliwy wpływ na wydajność systemu.
Aby wyłączyć ostrzeżenie (w NetBeans 7.2.1): Preferencje -> Edytor -> Wskazówki -> Rejestrowanie -> Łączenie ciągów w rejestratorze. Opis mówi: " Nie jest wydajne pod względem wydajności łączenie ciągów w komunikatach rejestratora.Jednak lepiej jest użyć szablonu wiadomości z symbolami zastępczymi, które są zastąpione konkretnymi wartościami tylko wtedy, gdy wiadomość rzeczywiście zostanie zarejestrowana." –
Właściwie przegapiłeś jedną z głównych zalet, dodam teraz odpowiedź, mimo że jest późno :) –
Ale ostrzeżenie jest nieefektywne, ponieważ konkatenacja jest zawsze wykonywana w przeciwieństwie do wykonywania jej tylko w zależności od bieżącego poziomu rejestrowania w przypadku korzystania z parametrów ['log (poziom poziomu, ciąg msg, Object []) (https://docs.oracle.com/javase/8/docs/api/java/util/logging/Logger.html # log-java.util.logging.Level-java.lang.String-java.lang.Object: A-) method. – Adam