Czy jest jakaś zaleta używania {}
zamiast konkatenacji ciągów?
Przykład z slf4j
logger.debug("Temperature set to {}. Old temperature was {}.", t, oldT);
zamiast
logger.debug("Temperature set to"+ t + ". Old temperature was " + oldT);
Myślę, że chodzi o optymalizację prędkości, ponieważ oceny parametrów (i konkatenacji ciągów) można uniknąć w czasie wykonywania, w zależności od pliku konfiguracyjnego. Ale możliwe są tylko dwa parametry, a czasami nie ma innego wyboru niż konkatenacja ciągów. Potrzeba opinii na ten temat.
źródło
Krótka wersja: Tak, jest szybsza, z mniejszą ilością kodu!
Łączenie ciągów wykonuje dużo pracy bez wiedzy, czy jest potrzebne, czy nie (tradycyjny test „obsługuje debugowanie” znany z log4j) i należy go unikać, jeśli to możliwe, ponieważ {} umożliwia opóźnienie wywołania toString () i konstrukcji ciągu po ustaleniu, czy wydarzenie wymaga nagrania, czy nie. Dzięki formatowaniu pliku rejestrującego pojedynczy plik ciąg, kod staje się moim zdaniem czystszy.
Możesz podać dowolną liczbę argumentów. Zauważ, że jeśli używasz starej wersji sljf4j i masz więcej niż dwa argumenty
{}
, musisz użyćnew Object[]{a,b,c,d}
składni, aby zamiast tego przekazać tablicę. Zobacz np. Http://slf4j.org/apidocs/org/slf4j/Logger.html#debug(java.lang.String, java.lang.Object []) .Odnośnie prędkości: Ceki jakiś czas temu opublikował benchmark na jednej z list.
źródło
debug(String format, Object... arguments)
. Zobacz slf4j.org/faq.html#logging_performancePonieważ String jest niezmienny w Javie, więc lewy i prawy ciąg muszą zostać skopiowane do nowego ciągu dla każdej pary konkatenacji. Więc lepiej wybierz symbol zastępczy.
źródło
Inną alternatywą jest
String.format()
. Używamy go w jcabi-log (statyczne opakowanie narzędziowe wokół slf4j).Jest znacznie łatwiejszy w utrzymaniu i rozbudowie. Poza tym łatwo to przetłumaczyć.
źródło
value
zmian, musisz cofnąć się i zmienić również instrukcję logowania. Coś, w czym IDE nie pomogą. Rejestratory powinny pomagać w debugowaniu i nie przeszkadzać. :-)String.format("%d", "Test")
generuje ostrzeżenie IntelliJArgument type 'String' does not match the type of the format specifier '%d'.
. Chociaż nie jestem pewien, czy nadal byłby w stanie zapewnić tę inteligentną odpowiedź podczas pracy z powyższym rozwiązaniem.Myślę, że z punktu widzenia autora głównym powodem jest zmniejszenie narzutu związanego z konkatenacją ciągów, po prostu przeczytałem dokumentację rejestratora, możesz znaleźć następujące słowa:
źródło