Czy "static final Logger" powinien być zadeklarowany wielkimi literami?

W Javie statyczne zmienne końcowe są stałymi, a konwencja jest taka, że powinny być pisane wielkimi literami. Widziałem jednak, że większość ludzi deklaruje loggery małymi literami, co pojawia się jako naruszenie w PMD.

Np:

private static final Logger logger = Logger.getLogger(MyClass.class);

Po prostu wyszukaj w google lub więc dla "static final logger", a zobaczysz to na własne oczy.

Czy zamiast tego powinniśmy używać LOGGERA?

Author: Community, 2009-09-13

10 answers

Odniesienie do loggera nie jest stałą, ale odniesienie końcowe i nie powinno być pisane wielkimi literami. Wartość stała powinna być pisana wielkimi literami.

private static final Logger logger = Logger.getLogger(MyClass.class);

private static final double MY_CONSTANT = 0.0;
 253
Author: crunchdog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-13 08:40:32

Aby dodać więcej wartości do odpowiedzi crunchdog, przewodnik Java Coding Style Guide stwierdza to w pkt 3.3 nazewnictwo pól

Nazwy pól używanych jako stałe powinny być wielkimi literami, z podkreślnikami oddzielającymi słowa. Za stałe uważa się:

  1. Wszystkie static final typy prymitywne (pamiętaj, że wszystkie pola interfejsu są z natury static final).
  2. Wszystkie static final typy odniesienia obiektów, które nigdy nie są po którym następuje" . " (kropka).
  3. Wszystkie static final tablice, po których nigdy nie następuje "[" (kropka).

Przykłady:

MIN_VALUE, MAX_BUFFER_SIZE, OPTIONS_FILE_NAME

Zgodnie z tą konwencją, logger jest static final odniesieniem do obiektu, jak wspomniano w punkcie 2, ale ponieważ jest po którym następuje "." za każdym razem, gdy go używasz, nie może być traktowana jako stała i dlatego powinna być pisana małymi literami.

 194
Author: cbliard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-02 21:07:27

From effective java, 2nd ed.,

Jedyny wyjątek od poprzedniej reguły dotyczy " stałych pól," których nazwy powinny składać się z jednego lub więcej wielkich słów oddzielonych znak podkreślenia, na przykład VALUES lub NEGATIVE_INFINITY. A pole stałe to statyczne pole końcowe, którego wartość jest niezmienna . Jeśli a statyczne pole końcowe ma typ pierwotny lub niezmienny Typ odniesienia (Poz. 15), wówczas jest to pole stałe. Na przykład stałe enum są polami stałymi. Jeśli statyczne pole końcowe ma zmienną referencję typu, może nadal być polem stałym, jeśli obiekt odniesienia jest niezmienny.

Podsumowując, stała = = static final, plus jeśli jest referencją (vs. typ prosty), niezmienność.

Patrząc na rejestrator slf4j, http://www.slf4j.org/api/org/slf4j/Logger.html

Jest niezmienna. Z drugiej strony, JUL logger jest zmienny. Logger log4j jest również zmienny. Aby być poprawnym, jeśli używasz log4j lub JUL, powinien to być "logger", a jeśli używasz slf4j, powinien to być LOGGER.

Zauważ, że strona javadocs slf4j podlinkowana powyżej ma przykład, w którym używają "logger", a nie"LOGGER".

Są to oczywiście tylko konwencje, a nie Zasady. Jeśli przypadkiem używasz slf4j i chcesz użyć "logger", ponieważ jesteś przyzwyczajony do tego z innych frameworków, lub jeśli jest łatwiej pisać, lub dla czytelności, śmiało.

 36
Author: Jeffrey Blattman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-17 08:16:34

I like Google ' s take on it (Google Java Style)

Każda stała jest statycznym polem końcowym, ale nie wszystkie statyczne pola końcowe są stałymi. Przed wyborem stałej sprawy zastanów się, czy pole naprawdę czuje się jak stała. Na przykład, jeśli którakolwiek z obserwowalnych instancji może się zmienić, prawie na pewno nie jest stała. Sam zamiar nigdy nie zmutowania obiektu nie wystarcza.

Przykłady:

// Constants
static final int NUMBER = 5;
static final ImmutableList<String> NAMES = ImmutableList.of("Ed", "Ann");
static final Joiner COMMA_JOINER = Joiner.on(',');  // because Joiner is immutable
static final SomeMutableType[] EMPTY_ARRAY = {};
enum SomeEnum { ENUM_CONSTANT }

// Not constants
static String nonFinal = "non-final";
final String nonStatic = "non-static";
static final Set<String> mutableCollection = new HashSet<String>();
static final ImmutableSet<SomeMutableType> mutableElements = ImmutableSet.of(mutable);
static final Logger logger = Logger.getLogger(MyClass.getName());
static final String[] nonEmptyArray = {"these", "can", "change"};
 29
Author: mateuscb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-11 19:07:11

Jeśli używasz zautomatyzowanego narzędzia do sprawdzania standardów kodowania i narusza ono wspomniane standardy, należy je naprawić. Jeśli używasz zewnętrznego standardu, popraw kod.

Konwencja w Sun Java jest pisana wielkimi literami dla publicznych stałych statycznych. Oczywiście logger nie jest stały, ale reprezentuje zmienną rzecz ( w przeciwnym razie nie byłoby sensu wywoływać na nim metod w nadziei, że coś się stanie ); nie ma określonego standardu dla niestałej ostatecznej pola.

 10
Author: Pete Kirkham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-13 08:31:49

Jeśli to wygooglujesz, może się okazać, że w niektórych przypadkach rejestratory nie są zdefiniowane jako static final. Dodaj do tego szybki copy-n-paste, a to może to wyjaśnić.

Używamy LOGGERA w całym naszym kodzie, co odpowiada naszej konwencji nazewnictwa (i nasz styl CheckStyle jest z niej zadowolony).


Idziemy nawet dalej, wykorzystując ścisłą konwencję nazewnictwa w Eclipse. Tworzymy nową klasę z szablonem kodu:

    // private static final Logger LOGGER = Logger.getLogger(${enclosing_type}.class);

Logger jest komentowany Na zewnątrz, ponieważ początkowo nie potrzebujemy go. Ale jeśli będziemy tego potrzebować później, po prostu go odkomenderujemy.

Następnie w kodzie używamy szablonów kodu, które oczekują obecności tego rejestratora. Przykład z szablonem try-catch:

    try {
      ${cursor} or some other template
    } catch (Exception t) {
      LOGGER.error("${methodName} ${method parameters}", t);
    }

Mamy jeszcze kilka szablonów, które go używają.

Ścisła konwencjapozwala nam być bardziej produktywnym i spójnym z szablonami kodu .

 7
Author: KLE,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-06 13:27:01

Ja osobiście uważam, że to wygląda naprawdę duże w górnej części. Co więcej, ponieważ jest to klasa, która nie jest bezpośrednio związana z zachowaniem klasy, nie widzę większego problemu w używaniu logger zamiast LOGGER. Ale jeśli chcesz być ściśle pedantyczny, użyj LOGGER.

 6
Author: João Silva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-13 08:27:29

Nie zapominaj, że PMD uszanuje komentarz z

// NOPMD

W nim. Spowoduje to, że PMD pominie linię z jej sprawdzeń, co pozwoli Ci wybrać dowolny styl.

 4
Author: Fortyrunner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-14 11:07:19

Zazwyczaj stałe są pisane wielkimi literami.

Loggery nie powinny jednak być statyczne, lecz sprawdzane dla każdej" nowej " klasy, jeśli używa się fasady slf4j. Pozwala to uniknąć nieprzyjemnych problemów z classloaderem, zwłaszcza w kontenerach internetowych, a także pozwala frameworkowi rejestratora wykonywać specjalne czynności w zależności od kontekstu wywołania.

 3
Author: Thorbjørn Ravn Andersen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-13 09:21:42

Jeśli Twoje standardy kodowania - jeśli je masz-mówią, że powinny być duże, to tak.

Nie widzę żadnych surowych powodów w taki czy inny sposób. Myślę, że to zależy od twoich osobistych upodobań. standardy kodowania Twojej firmy.

BTW: wolę "LOGGER"; -)

 1
Author: Kutzi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-13 13:02:35