Czy rejestrator powinien być uznany za statyczny, czy nie? Zwykle widziałem dwa rodzaje deklaracji dla rejestratora:
chroniony dziennik dziennika = nowy Log4JLogger (aClass.class);
lub
prywatny statyczny Log log = new Log4JLogger (aClass.class);
Którego należy użyć? jakie są plusy i minusy obu?
static
to jedna referencja na klasę. niestatyczne to jedno odwołanie na instancję (+ inicjalizacja). Więc w niektórych przypadkach ta ostatnia ma znaczący wpływ na pamięć, jeśli masz mnóstwo instancji. Nigdy nie używaj niestatyki w częstym obiekcie. Zawsze używam wersji statycznej. (które powinny być duże literyLOG
)private static final Log log
małe. Rejestrator nie jest stałą, rejestrator jest statycznym obiektem końcowym (który można zmutować). Osobiście zawsze używamlogger
.Odpowiedzi:
Zaletą niestatycznej postaci jest to, że możesz zadeklarować ją w (abstrakcyjnej) klasie bazowej, jak poniżej, bez obawy, że zostanie użyta właściwa nazwa klasy:
Jednak jego wadą jest oczywiście to, że dla każdej instancji klasy zostanie utworzona zupełnie nowa instancja programu rejestrującego. Może to nie być kosztowne, ale powoduje znaczne obciążenie. Jeśli chcesz tego uniknąć, wolisz skorzystać z
static
formularza. Ale jego wadą jest z kolei to, że musisz zadeklarować to w każdej indywidualnej klasie i uważać w każdej klasie, aby podczas budowy rejestratora została użyta właściwa nazwa klasy, ponieważgetClass()
nie można jej użyć w kontekście statycznym. Jednak w przeciętnym środowisku IDE można w tym celu utworzyć szablon autouzupełniania. Np.logger
+ctrl+space
. .Z drugiej strony, jeśli otrzymujesz rejestrator z fabryki, która z kolei może buforować już utworzone instancje rejestratorów, to użycie niestatycznej postaci nie spowoduje zbyt dużego obciążenia. Na przykład Log4j ma
LogManager
do tego celu.źródło
abstract Log getLogger();
w klasie abstrakcyjnej. Zaimplementuj tę metodę, zwracając statyczny rejestrator dla określonego wystąpienia. Dodajprivate final static Log LOG = LogManager.getLogger(Clazz.class);
do szablonu klasy IDE.protected Logger log = LoggerFactory.getLogger(getClass());
Kiedyś myślałem, że wszystkie rejestratory powinny być statyczne; jednak ten artykuł na wiki.apache.org kilka ważnych problemów z pamięcią, dotyczących wycieków classloadera. Zadeklarowanie programu rejestrującego jako statycznego zapobiega gromadzeniu deklarowanej klasy (i skojarzonych programów ładujących klasy) w kontenerach J2EE korzystających ze współdzielonego modułu ładującego. Spowoduje to błędy PermGen, jeśli ponownie wdrożysz aplikację wystarczająco dużo razy.
Naprawdę nie widzę żadnego sposobu na obejście tego problemu z wyciekiem klas, poza deklarowaniem rejestratorów jako niestatycznych.
źródło
Najważniejsza różnica dotyczy tego, jak wpływa na pliki dziennika: do której kategorii trafiają dzienniki?
Istnieje wariant twojego pierwszego przypadku:
chroniony dziennik dziennika = nowy Log4JLogger (getClass ());
W takim przypadku kategoria dziennika mówi, na którym obiekcie pracował zarejestrowany kod.
W drugiej opcji (private static) kategorią dziennika jest klasa zawierająca kod rejestrowania. Zwykle jest to klasa, która wykonuje rejestrowaną czynność.
Gorąco polecam tę ostatnią opcję. Ma te zalety w porównaniu z innymi rozwiązaniami:
Ma też wady:
źródło
Użyj odwrócenia kontroli i przekaż rejestrator do konstruktora. Jeśli utworzysz program rejestrujący w klasie, będziesz mieć niesamowity czas z testami jednostkowymi. Piszesz testy jednostkowe, prawda?
źródło