enum final Methoden

Status
Nicht offen für weitere Antworten.
M

MrChance

Gast
Hi !
Wieso kann man in enums final-Methoden deklarieren, wenn enums eh nicht weitervererbt werden ?
Man könnte zwar damit das Überschreiben in der enum selbst unterbinden - aber wieso sollte ein
Entwickler eine Methode als final deklarieren, um dann gleich darauf in der gleichen enum zu überschreiben ?
Frage: Welchen Anwendungsfall gibt es denn für eine final-Methode in einer enum ???
 
S

SlaterB

Gast
genauso kannst du in jeder Klasse private-Operation als final deklarieren, obwohl dort das gleiche gilt,
wozu mühsam den Compiler solche Regeln prüfen lassen?
stört doch niemanden

was meinst du eigentlich mit 'in der gleichen Klasse überschreiben'? geht nicht
 
M

MrChance

Gast
enum myEnum{
K1,
K2,
K3 { int met() { return 1; };
int meth() { return 0; }
}

wenn man meth() als final deklariert, kann man es nicht bei K3 überschreiben.

Also: Welchen Anwendungsfall gibt es für eine final-Methode in einer enum ???
 
S

SlaterB

Gast
bezieht sich das return 1; auf eine Operation nur für K3?

nun dann ist das doch eine ganz normale Vererbung, die zufällig innerhalb einer Klasse steht,
Vererbung macht allgemein Sinn,
Vererbung muss dann aber (wie überall sonst in Java auch) immer geprüft werden,

bei jedem Aufruf von meth() schaut der Interpreter, ob das aktuelle Enum-Objekt die Operation überschrieben hat oder ob die allgemeine Operation verwendet werden soll,
mit final kann man die Überprüfung sparen, dann ist klar dass es nur eine Operation gibt
 
M

MrChance

Gast
K3.meth() gibt dann 1, während die anderen 0 zurückgeben.

Vererbt wird mit dem Schlüsselwort "extend".
Bei einer Klasse macht das final ja auch Sinn.

Es gibt aber kein enum A extends B !
 
M

MrChance

Gast
Haaaa.. mir ist eine "mögliche" Erklärung eingefallen:
Final Methoden werden vom Compiler optimiert - und wenn
man ihm zu verstehen gibt, dass eine Methode nicht wie im
obigem Beispiel überschrieben werden kann, so kann er die
Optimierung durchführen.

Aber eigentlich müsste der Compiler ja selbst sehen, dass die
Methode nicht überschrieben wird und auch nicht durch Vererbung
überschrieben werden kann und automatisch eine Optimierung
durchführen !!!???
 
S

SlaterB

Gast
> mir ist eine "mögliche" Erklärung eingefallen

menno, das habe ich doch schon geschrieben :cool:

aber ich stimme dir zu, dass das ein schlauer Compiler sich selber erarbeiten könnte
 
M

MrChance

Gast
na ja, OK :) Ich habs aber schöner formuliert ;-)

Dennoch könnte es einen Anwendungsfall geben !!!!
 
R

Roar

Gast
*doofguck*
wenn meth final wäre, würde dein beispiel:

Code:
enum myEnum{
K1,
K2,
K3 { int meth() { return 1; };
(final) int meth() { return 0; }
}

nicht funktionieren, da meth() nicht in K3 üebrschrieben werden könnte, also hat hier final genauso seinen zweck wie bei normalen klassen, auch wenn eh niemand anderes, außer den enum konstanten, die methode überschreiben könnten.
 
M

MrChance

Gast
Hab ich ja weiter oben geschrieben: Wieso sollte ein Entwickler eine Methode final machen, wenn er sie überschreiben will ?
 
R

Roar

Gast
er will sie final machen, damit er sie nicht mehr überschreiben kann...
 
M

MrChance

Gast
...ah, das final ist gegen schizophrene Entwickler gedacht ? ;-)

Im Ernst: Wer oder wieso sollte jemand dies machen ???
 
R

Roar

Gast
wenn du nen paar hundert klassen hast, weißt du nach 1 jahr nicht mehr, dass du dir mal ganz fest vorgenommen hast die methode nicht zu überschreiben.
final darf man nicht nur in öffentlicher api verwenden.
 
G

Guest

Gast
Ich schätze mal, dass es eingebaut wurde, um zu verhindern, dass ein Programmteil ab einem bestimmten Zeitpunkt es nicht mehr verändert...
 
M

MrChance

Gast
mmm... das haben sich also die Sun-Leute dabei gedacht, als sie final für enums erlaubten ????
 
M

MrChance

Gast
sorry - final für enums ist natürlich nicht erlaubt, auch wenn sie per Definition schon nicht erweiterbar sind. Gemeint war natürlich final für Methoden in enums ! ;-)
 

Yzebär

Bekanntes Mitglied
SlaterB hat gesagt.:
aber ich stimme dir zu, dass das ein schlauer Compiler sich selber erarbeiten könnte
Wie sollte er das können? Er kann ja nicht hellsehen und weiß nicht, zu welchem Zeitpunkt welche Klasse geladen wird. Die Klasse, die eine bestimmte Methode überschreibt, kann ja später noch nachgeladen werden. Nur "final", "private" oder "static" garantieren, daß die Methoden nicht überschrieben werden können.

final gibt es aus mehreren Gründen. Zum einen, final Variablen oder Methoden werden in einem anderen Speicherbereich abgelegt, als dynamische Variablen oder überschreibbare Methoden, der JIT-Compiler, muß nicht mehr prüfen, ob sich Werte geändert haben oder welche (der überschriebenen) Methoden er aufrufen muß. In früheren JVMs hatte man dadurch auch noch Geschwindigkeitsvorteile. Die neuesten JITs können aber auch ohne final sehr gut optimieren.

Zum anderen weiß jemand, der den Sourcecode liest, daß eine Variable oder Methode nur einmal initialisiert bzw. deklariert wurde. Wird dennoch versucht etwas zu überschreiben oder einer final Variablen einen neuen Wert zuzuweisen, gibt es einen Kompilierfehler.
 
S

SlaterB

Gast
es geht hier doch um den speziellen Fall der Enums,
diese können nicht vererbt werden also hat der Kompiler den kompletten Quellcode und kann nachschauen ob eine der Enum-Elemente erbt oder nicht,

--------

final um Überschreiben zu verhindern, gerade auch wenn mehrere Programmierer an der Enum werkeln,
ist als Argument zu akzeptieren, aber nicht besonders stark,

gut, final wird überall in Java ähnlich eingesetzt, aber man sollte doch eher verstehen was man so tut,
kommentieren und Kommentare lesen usw.,
ist ein Java-Programmierer in anderen OO-Sprachen aufgeschmissen oder ist das überall Standard? ;)
 
M

MrChance

Gast
Wir reden über Methoden in enums. (nicht Klassen)
enum Methoden können nur in der enum selbst überschrieben
werden.
Wenn der Entwickler seine Methoden nicht überschreiben will,
dann überschreibt er sie halt nicht. Wieso sollte er sie dann
noch final deklarieren ? (Ausser aus Performancegründen)

Oder ?
 
B

Beni

Gast
Vielleicht weil Enums vom Compiler kurzerhand in Klassen umgeschrieben werden, und es für die Entwickler einfacher war, final einfach zuzulassen ("final erlaubt" ist einfacher als "final erlaubt aber nur wenn..." :wink: )
 

byte

Top Contributor
MrChance hat gesagt.:
Wenn der Entwickler seine Methoden nicht überschreiben will,
dann überschreibt er sie halt nicht. Wieso sollte er sie dann
noch final deklarieren ? (Ausser aus Performancegründen)

Was ist denn das für ein Argument? Wenns danach geht, braucht man auch Methoden in Klassen nicht final deklarieren.

Klar liegt da der Nutzen eher auf der Hand, aber ich sehe auch keinen Grund, warum man final bei Enums explizit verbieten sollte. Der Nutzen ist gering aber existent, denn manchmal arbeiten auch mehrere Personen am selben Code.

Im Übrigen ist Performance (wie schon gesagt wurde) kein Faktor bei final Deklarationen mehr bei aktuellen VMs.
 
S

SlaterB

Gast
bei normalen Klassen hat man z.T. riesige Strukturen, die auch bis in alle Ewigkeit noch erweitert werden können,
wer kann schon bei Component, JComponent, Container usw. den Überblick behalten,

bin Enum ist das aber anders, Enums erben von niemanden und werden von niemanden geerbt,
da kann man das Argument 'bessere Übersicht, final nicht nötig' nicht ganz platt abschieben,

aber auch eine Enum kann groß werden,
kann monatelang nicht mehr bearbeitet worden sein,
kann von mehreren Programmierern bearbeitet werden,
insofern ist die Gemeinsamkeit mit anderen final-Anwendungen wirklich gegeben
 
M

MrChance

Gast
..ich glaub, der Beni hat schon ein wenig recht:
Die enums werden wohl in Klassen umgewandelt.
Und werden sie nicht aus der Klasse Enum abgeleitet ?
 
S

SlaterB

Gast
Die Umwandlung ist bei der Frage irrelevant,
und jede Klasse wird von Object abgeleitet, also erbt eh jederman.

Dennoch stimme ich auch zu, dss Beni ein wenig oder gar bisschen mehr recht hat. ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F enum oder static final boolean? Java Basics - Anfänger-Themen 18
P Enum oder normale Klasse? Java Basics - Anfänger-Themen 10
volcanos enum und switch (neu): falschen Wert mit IllegalArgumentException oder mit EnumConstantNotPresentException abfangen ? Java Basics - Anfänger-Themen 51
X Enum Abfrage ohne if, for, while oder switch Java Basics - Anfänger-Themen 21
U Warum kann ich die Methode in der ENUM Klasse nicht aufrufen? Und warum geht die Switch nicht? Java Basics - Anfänger-Themen 8
D Frage bzgl. Enum-Handhabung Java Basics - Anfänger-Themen 16
S Java Enum Java Basics - Anfänger-Themen 2
I Validation, ob String ein Wert aus einem Enum enthält Java Basics - Anfänger-Themen 3
V Enum Java Basics - Anfänger-Themen 1
C Farben als Enum Java Basics - Anfänger-Themen 3
N enum Attribut von Objekten einer Hashmap ausgeben Java Basics - Anfänger-Themen 6
I JAXB und Enum Java Basics - Anfänger-Themen 7
M Enum-Variable HashMap zuweisen Java Basics - Anfänger-Themen 5
B Enum innerhalb einer Klasse / anderes Konzept Java Basics - Anfänger-Themen 8
N Enum Typen, was passiert intern mit ihnen? Java Basics - Anfänger-Themen 2
A enum Java Basics - Anfänger-Themen 6
O Enum Array Rekursiv abarbeiten Java Basics - Anfänger-Themen 44
B ENUM to List<String> konvertieren Java Basics - Anfänger-Themen 2
N Java Enum converter Methode Java Basics - Anfänger-Themen 5
F Enum von Ländern Java Basics - Anfänger-Themen 8
J Klassen Enum als Informationsträger Java Basics - Anfänger-Themen 10
T Datentypen enum static Chaos (blutiger anfänger) Java Basics - Anfänger-Themen 5
R Enum ist das gleiche wie? Java Basics - Anfänger-Themen 15
P Klassen Richtige Anwendung einer Enum-Klasse Java Basics - Anfänger-Themen 11
E Datentypen Problem beim Speichern von enum. Java Basics - Anfänger-Themen 10
J Compiler-Fehler class interface or enum expected Java Basics - Anfänger-Themen 1
E Objektvergleich Enum Java Basics - Anfänger-Themen 7
kilopack15 Euromünzen in enum als Liste ausgeben Java Basics - Anfänger-Themen 11
N Enum als generischer Typ Java Basics - Anfänger-Themen 4
H Datentypen Fehler bei Verwendung von enum Java Basics - Anfänger-Themen 9
lBlKha0s Fehlermeldung : class interface or enum expected Java Basics - Anfänger-Themen 9
T error: class, interface, or enum expected Java Basics - Anfänger-Themen 5
S Menüauswahl per Enum Java Basics - Anfänger-Themen 12
F Enum via String definieren Java Basics - Anfänger-Themen 2
L Compiler-Fehler error: class, interface or enum expected Java Basics - Anfänger-Themen 2
M java.lang.Enum.valueOf(Unknown Source) Java Basics - Anfänger-Themen 2
M Enum-Variabel-Abfrage funktioniert nicht? Java Basics - Anfänger-Themen 2
P Fallunterscheidung mit Überprüfung (enum) Java Basics - Anfänger-Themen 11
H enum Type Java Basics - Anfänger-Themen 6
F Operatoren Enum aus Textdabei laden Java Basics - Anfänger-Themen 3
P enum: cannot be resolved to a type Java Basics - Anfänger-Themen 2
kaoZ Variablen Konstantensammlung vs. Enum Java Basics - Anfänger-Themen 9
H Enum außerhalb einer Klasse? Java Basics - Anfänger-Themen 2
K OOP Aufzählungstypen! enum Currency!!! Java Basics - Anfänger-Themen 5
F ENUM als Variable Java Basics - Anfänger-Themen 4
M Enum: Zugriff auf Konstanten Java Basics - Anfänger-Themen 7
W Enum Konstruktor Type Java Basics - Anfänger-Themen 2
A Erste Schritte ENUM - Werte zurückgeben Java Basics - Anfänger-Themen 5
D Enum als Parameter Java Basics - Anfänger-Themen 6
B Variablen Instanz von Enum zur Laufzeit erstellen und zuweisen Java Basics - Anfänger-Themen 2
B Datentypen Enum vererben/gruppieren? Java Basics - Anfänger-Themen 6
F Datentypen enum Java Basics - Anfänger-Themen 5
J Enum zählen Java Basics - Anfänger-Themen 8
D Einlesen eines Enum-Wertes per console Java Basics - Anfänger-Themen 3
K String mit ENUM vergleichen? Java Basics - Anfänger-Themen 6
N enum vergleiche Klammern? Java Basics - Anfänger-Themen 5
J public enum? in Java Java Basics - Anfänger-Themen 9
D Erste Schritte Enum - das unbekannte Wesen Java Basics - Anfänger-Themen 3
Y ENUM auslesen (Name des ENUM als Variable) Java Basics - Anfänger-Themen 4
P Compiler-Fehler "class, interface, or enum expected" Java Basics - Anfänger-Themen 5
K class, interface or enum expected Java Basics - Anfänger-Themen 14
pg1337 enum-Aufgabe Java Basics - Anfänger-Themen 5
N was sagt enum aus? Java Basics - Anfänger-Themen 3
S Methoden Enum Parameter in Methode Java Basics - Anfänger-Themen 7
G Datentypen enum Frage Java Basics - Anfänger-Themen 3
R Probleme mit Enum Java Basics - Anfänger-Themen 10
B Enum: Instanzen Java Basics - Anfänger-Themen 10
B Generic? Enum - So lösbar? Java Basics - Anfänger-Themen 8
T class, interface, or enum expected Java Basics - Anfänger-Themen 2
M Vererbung Enum Vererbung/Polymorphie Java Basics - Anfänger-Themen 2
P Enum Attribut in Konstruktoren Java Basics - Anfänger-Themen 10
4 Enum Problem Java Basics - Anfänger-Themen 2
turmaline Bindestrich in enum? Java Basics - Anfänger-Themen 5
T Enum - Key als Value ermitteln Java Basics - Anfänger-Themen 7
X enum Fehlermeldung "The public type Day must be defined in its own file" Java Basics - Anfänger-Themen 8
T ist enum.ordinal keine Konstante? Java Basics - Anfänger-Themen 7
R State machine mit enum Java Basics - Anfänger-Themen 9
L enum aus Integer umwandeln Java Basics - Anfänger-Themen 3
C Klasseninstanzierung mit enum-Parameter erzwingen Java Basics - Anfänger-Themen 2
I Enum in String Java Basics - Anfänger-Themen 4
N enum richtig verwenden Java Basics - Anfänger-Themen 5
M for(Enum..., ButtonGroup.getElements()... Java Basics - Anfänger-Themen 3
StrikeTom Fragen zu enum Java Basics - Anfänger-Themen 4
A Was ist performanter für Konstanten, enum oder static variablen Java Basics - Anfänger-Themen 5
L String zu Enum parsen Java Basics - Anfänger-Themen 8
J Datentypen Array in enum, ?? Wozu ?? Java Basics - Anfänger-Themen 3
S OOP Durch ein Enum iterieren... Java Basics - Anfänger-Themen 47
K Datentypen enum und liste Java Basics - Anfänger-Themen 7
S String - Enum Java Basics - Anfänger-Themen 3
H Eine enum switchen? Java Basics - Anfänger-Themen 7
G enum für Typsicherheit Java Basics - Anfänger-Themen 9
J class, interface, or enum expected - finde Fehler nicht. Java Basics - Anfänger-Themen 4
J OOP enum Java Basics - Anfänger-Themen 2
O Problem (Enum) Java Basics - Anfänger-Themen 14
S Enum als Index Java Basics - Anfänger-Themen 5
H Enum --> int ?? Java Basics - Anfänger-Themen 3
tanja enum in java Java Basics - Anfänger-Themen 3
D class, interface or enum expected Java Basics - Anfänger-Themen 2
A OOP Übergabe eines Wertes an den enum Konstruktor Java Basics - Anfänger-Themen 12
T Simple Enum Fragen Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben