Heute hatte ich eine Diskussion mit einem Mitarbeiter über die Benennung von final
Feldern in Java-Klassen.
In seiner Sichtweise final
sollten Felder auch als Konstanten betrachtet werden, da sich ihre Werte nach dem Erstellen der Instanz nicht ändern.
Dies würde zu der folgenden Namenskonvention für final
Felder führen:
public class Foo {
private static final String BLA_BLA = "bla";
private final String BAR_BATZ;
...
}
Meiner Meinung nach sollten nur static final
Felder als Konstanten betrachtet werden, während Felder, die nur final
sind, der üblichen camelCase-Namenskonvention folgen sollten.
public class Foo {
private static final String BLA = "bla";
private final String barBatz;
...
}
Jetzt bin ich ein bisschen unsicher, da er ein weitaus erfahrenerer Programmierer ist als ich, und ich stimme normalerweise seiner Meinung zu und betrachte ihn als einen sehr guten Entwickler.
Irgendwelche Eingaben dazu?
...
sollte jeden möglichen Konstruktor symbolisieren, der dasfinal
Feld setzt, aber das ist für dasstatic final
Feld offensichtlich nicht möglich .static { }
Blöcke, mit denen statische Felder innerhalb einer Klasse einmalig beim Laden der Klasse gesetzt werden können. Verwandte Arbeiten mit statischen Konstruktoren in Java .Antworten:
Sun (und jetzt Oracle) haben ein Dokument mit dem Titel " Code Conventions for the Java Programming Language" (Codekonventionen für die Java-Programmiersprache ) gepflegt . Das letzte Update dazu war '99, aber die Essenz der Stilrichtlinie lebt weiter.
Kapitel 9 behandelt Namenskonventionen.
Für einen Bezeichnertyp von 'Konstanten':
Die angeführten Beispiele:
In einem neueren Dokument ist es eingedrungen. Aus Variablen (Die Java-Tutorials> Lernen der Java-Sprache> Sprachgrundlagen :
Viele statische Analysatoren für Java versuchen dies zu erzwingen. Zum Beispiel Checkstyle erzwingt:
Das läuft wirklich auf die Konventionen der Community hinaus, die den Code schreiben ... und ihn im Idealfall beibehalten.
Die obigen Beispiele sind als
static final
solche angegeben , die wahrscheinlich von den C-Konventionen für abgeleitet sind#define
- die wie C während der Kompilierung und nicht zur Laufzeit im Code ersetzt werden.Die Frage, die dann gestellt werden sollte, lautet: "Verhält sich das wie eine Konstante? Oder verhält es sich wie ein Feld zum einmaligen Schreiben?" - und dann die Konventionen entsprechend befolgen. Der Lackmustest für eine solche Frage wäre "Wenn Sie das Objekt serialisieren würden, würden Sie das letzte Feld einschließen?". Wenn die Antwort lautet, dass es sich um eine Konstante handelt, behandeln Sie sie als solche (und serialisieren Sie sie nicht). Auf der anderen Seite ist es keine Konstante, wenn es Teil des Zustands des Objekts ist, der serialisiert werden müsste.
In jedem Fall ist es wichtig, den Code-Stil beizubehalten, so richtig oder falsch er auch sein mag. Aus inkonsistenten Konventionen innerhalb eines Projekts entstehen schlimmere Probleme als nur etwas, das das Auge verletzt. Erwägen Sie, statische Analysetools zu erwerben und diese so zu konfigurieren, dass die Konsistenz erhalten bleibt.
quelle
MinWidth
stattMIN_WIDTH
. Eine andere Frage ist: Was ist mit statischen Endloggern? Nennen Sie sieLOG
/LOGGER
oderlog
/logger
. Persönlichlog
sieht es im Code besser aus, aber wann ist Inkonsistenz akzeptabel, wenn überhaupt?BAR_BATZ
ist in diesem Beispiel keine Konstante. Die Konstruktoren vonFoo
können es auf Objektebene auf unterschiedliche Werte setzen. Beispielsweisequelle