Was ist eine vernünftige Reihenfolge von Java-Modifikatoren (abstrakt, endgültig, öffentlich, statisch usw.)?

114

Was ist eine vernünftige Reihenfolge von Java-Modifikatoren?

  • abstrakt
  • Finale
  • einheimisch
  • Privat
  • geschützt
  • Öffentlichkeit
  • statisch
  • strictfp
  • synchronisiert
  • vorübergehend
  • flüchtig

Aktualisieren

Ich habe den Wortlaut von empfohlen auf angemessen geändert, um die Diskussionen darüber zu beruhigen, ob die Reihenfolge empfohlen wird oder nicht.

Micha Wiedenmann
quelle
Es spielt keine Rolle, und Sie sollten nicht zu viel Zeit damit verschwenden, sich darüber zu quälen. Persönlich habe ich immer den Zugriffsmodifikator an die erste Stelle gesetzt, aber danach konnte ich Ihnen nicht einmal sagen, was ich als nächstes mache. Wenn Sie eine Referenz wünschen, versuchen Sie es hier , aber ich bin nicht sicher, ob sie dort überhaupt angegeben ist.
Marquis von Lorne
9
Ich frage mich, warum dies eine "nicht konstruktive" Frage sein sollte (enge Anfragen). Sie finden die Empfehlung in der Spezifikation (siehe meine Antwort). Wenn Sie dieser Empfehlung folgen, wird die Lesbarkeit des Codes verbessert. Static Code Analyzer (wie SONAR) beschwert sich, wenn Sie eine andere Reihenfolge verwenden.
FrVaBe
Ich habe mir die Oracle / Sun Java Code Conventions noch einmal angesehen . Die Angelegenheit wird nicht einmal erwähnt, an dem einen Ort, an dem Sie suchen sollten, und an dem einen Ort, an dem Sie erwarten würden, dass sie erscheint.
Marquis von Lorne
@EJB Die Code-Konventionen stammen aus dem Jahr 1999 und müssen dringend aktualisiert werden. Ich hoffe, dass sie dieses Thema aufnehmen, wenn sie diese Konventionen jemals wieder berühren, da es in der Tat ein guter Ort ist!
FrVaBe
1
Kann Eclipse die Modifikatoren automatisch sortieren? Oder zumindest eine Warnung geben, wenn sie unsortiert sind?
Roland

Antworten:

126

Die übliche Verwendungsreihenfolge der Modifikatoren ist in der Java-Sprachspezifikation (und nicht in der Java Virtual Machine-Spezifikation) angegeben, z. B. für Klassenmodifikatoren finden Sie die folgende Definition (Auszug):

ClassModifiers:
    ClassModifier
    ClassModifiers ClassModifier

ClassModifier: one of
    Annotation public protected private
    abstract static final strictfp

[....]

Wenn zwei oder mehr (unterschiedliche) Klassenmodifikatoren in einer Klassendeklaration erscheinen, ist es üblich, obwohl nicht erforderlich, dass sie in der Reihenfolge erscheinen, die mit der oben in der Produktion für ClassModifier angegebenen übereinstimmt. (kleiner Text am Ende des Absatzes!)

Sie finden diesen Satz an mehreren anderen Stellen, an denen die Verwendung von Modifikatoren angegeben ist, z. B. hier für Feldmodifikatoren.

Update : Ich habe "angegeben / empfohlen" durch "üblich" ersetzt, um dies zu einer akzeptablen Antwort zu machen. Berücksichtigen Sie dies, wenn Sie die Kommentare lesen ;-) (danke @EJP, um dies zu verdeutlichen) - Trotzdemwürde ich empfehlen , die übliche Reihenfolge zu verwenden.

Google empfiehlt außerdem die Verwendung der in der Java-Spezifikation angegebenen üblichen Reihenfolge.

public / protected / private 
abstract 
static 
final 
transient 
volatile 
synchronized 
native 
strictfp

Update :Für Projekte in der OpenJDK-Communitygibt es eine neueInitiative" Java Style Guidelines ". Es enthält auch eine Empfehlung für eine Modifikatorreihenfolge und enthält auch den neuen Standardmodifikator von Java 8.

public / private / protected
abstract
static
final
transient
volatile
**default**
synchronized
native
strictfp
FrVaBe
quelle
1
Die Frage war "Was ist die empfohlene Reihenfolge von Java-Modifikatoren?" und diese Fragen werden in der Sprachspezifikation beantwortet (und da die Bestellung nicht erforderlich ist, würde ich sagen, dass sie in der Spezifikation empfohlen wird). In der JVM-Spezifikation geht es um das Klassendateiformat und nicht um den Java-Quellcode. - In der Tat spielt die Reihenfolge keine Rolle, aber wenn Sie einer Empfehlung folgen, ist Ihr Code für andere besser lesbar. Ich denke, dies ist eine vernünftige Frage, auf die eine genaue Antwort gegeben werden kann. Übrigens - der statische Code-Analysator (z. B. SONAR) wird sich über die falsche Reihenfolge beschweren.
FrVaBe
3
Der Satz Wenn zwei oder mehr (unterschiedliche) Klassenmodifikatoren in einer Klassendeklaration erscheinen, ist es üblich, obwohl nicht erforderlich, dass sie in der Reihenfolge erscheinen, die mit der oben in der Produktion für ClassModifier angegebenen übereinstimmt. IST TEIL DER SPEZIFIKATION!
FrVaBe
1
In diesem Fall wollte ich schreien, aber ich habe mich bereits beruhigt - tut mir leid ;-) - ich bin auch nicht muttersprachlich - also haben Sie wahrscheinlich Recht mit der Sprachinterpretation. Was ich mit meiner Antwort nur sagen wollte, ist, dass es einen sehr offiziellen Ort gibt, an dem die Reihenfolge der Modifikatoren im Java-Quellcode behandelt wird - und ich hatte das Glück, dies zu finden, als ich mir dieselbe Frage stellte. IMHO gibt es keinen besseren Ort, um die Antwort zu finden als in der Java-Sprachspezifikation.
FrVaBe
1
Lassen Sie uns diese Diskussion im Chat fortsetzen
FrVaBe
1
@EJP Sie haben eine starke Meinung (~ keine empfohlene Reihenfolge) zu diesem Thema. Wären Sie so freundlich, dies als Antwort zu geben? Ich bin gespannt auf die Abstimmung.
FrVaBe
28

Es ist sinnvoll, die Reihenfolge gemäß der Java Virtual Machine-Spezifikation, Tabelle 4.4, zu verwenden

  • Öffentlichkeit
  • geschützt
  • Privat
  • abstrakt
  • Standard
  • statisch
  • Finale
  • vorübergehend
  • flüchtig
  • synchronisiert
  • einheimisch
  • strictfp
Micha Wiedenmann
quelle
8
+1 sehen Sie oft: "public abstract", "private static final" usw. Einige IDEs (z. B. NetBeans) haben sogar einige Verknüpfungen, z. B. "psf" oder "Psf"
Puce
1
Die empfohlene Reihenfolge finden Sie in der Java-Sprachspezifikation (und nicht in der Java Virtual Machine-Spezifikation!). Schau dir meine Antwort an.
FrVaBe
1
@FrVaBe Sie können so etwas nicht finden. Verwechseln Sie Sprachgrammatiken nicht mit Stilempfehlungen.
Marquis von Lorne
@Puce: Einige IDEs (z. B. IntelliJ IDEA) können die Modifikatoren sogar korrekt sortieren.
Mot
5

Basierend auf ihren int-Werten.

Modifikator (Java Platform SE 8)

  • 1: öffentlich
  • 2: privat
  • 4: geschützt
  • 8: statisch
  • 16: endgültig
  • 32: synchronisiert
  • 64: flüchtig
  • 128: vorübergehend
  • 256: native
  • 512: Schnittstelle
  • 1024: abstrakt
  • 2048: strictfp
Sero
quelle
1
Diese Antwort enthält nicht das Schlüsselwort "Standard"
Sero
1
Was haben ihre int-Werte damit zu tun?
Marquis von Lorne
0

Ich verwende zwei Regeln, um mich an die Modifikatorsequenz zu erinnern, schließe aber das strictfp nicht ein, da es von mir nie verwendet wird. Zu Ihrer Information.

  1. synchronisierte native sind Personen mit der geringsten Priorität.

  2. PPP AS FTV: PPP {Rauschgeräusch} AS {Fernsehen} FTV {France TV}.

:) :)

Houcheng
quelle