Ich habe versucht, den Grund für Konstanten in Java zu identifizieren. Ich habe erfahren, dass Java es uns ermöglicht, Konstanten mithilfe von final
Schlüsselwörtern zu deklarieren .
Meine Frage ist, warum Java keine Constant ( const
) -Funktion eingeführt hat. Da viele Leute sagen, dass es aus C ++ stammt, haben wir in C ++ ein const
Schlüsselwort.
Bitte teilen Sie Ihre Gedanken.
const
Schlüsselwort, aber keine zugrunde liegende Funktion. Titel und Tags wurden entsprechend korrigiert.Antworten:
Jedes Mal, wenn ich von schwerer C ++ - Codierung zu Java wechsle, brauche ich eine Weile, um mich an die mangelnde Konstanz in Java anzupassen . Diese Verwendung von
const
in C ++ unterscheidet sich stark von der Deklaration konstanter Variablen, wenn Sie es nicht wussten. Im Wesentlichen wird sichergestellt, dass ein Objekt unveränderlich ist, wenn über einen speziellen Zeigertyp namens const-pointer zugegriffen wird. In Java gebe ich an Orten, an denen ich normalerweise einen const-Zeiger zurückgeben möchte, stattdessen eine Referenz mit einem Schnittstellentyp zurück enthält nur Methoden, die keine Nebenwirkungen haben sollten. Leider wird dies von der Sprache nicht erzwungen.Wikipedia bietet folgende Informationen zu diesem Thema:
quelle
final
ist jedoch ähnlich.final
Methode zum Beispiel arbeiten völlig anders als C ++ -const
Methoden.final
Schlüsselwort für Eigenschaften oder Variablen stellt nur sicher, dass eine Eigenschaft oder Variable nur einmal zugewiesen wird . Man könnte den Zustand dieses Objekts immer noch ändern, indem man beispielsweise eine Methode mit Nebenwirkungen aufruft.final
ähnelt in gewisser Weise der Stapelzuweisung von C ++ in Bezug auf die Bezugnahme auf ein Objekt und nicht auf einen Zeiger, aber das ist alles. Dies ist natürlich zusätzlich zu dem, was dom0 bereits gesagt hat.final
in Java scheint wie C ++const
für Werttypen zu funktionieren , aber eher wie eine C ++ Nicht-KonstanteT&
für ReferenztypenWas bedeutet?
const
Stellen Sie zunächst fest, dass die Semantik eines "const" -Schlüsselworts für verschiedene Personen unterschiedliche Bedeutungen hat:
final
Semantik - Referenzvariable selbst kann nicht neu zugewiesen werden, um auf eine andere Instanz (Speicherort) zu verweisen, aber die Instanz selbst kann geändert werdenconst
Zeiger / Referenzsemantik - bedeutet, dass diese Referenz nicht zum Ändern der Instanz verwendet werden kann (z. B. kann Instanzvariablen nicht zugewiesen werden, kann keine veränderbaren Methoden aufrufen) - wirkt sich nur auf die Referenzvariable aus, sodass eine nicht konstante Referenz auf die verweist Dieselbe Instanz könnte die Instanz ändernWarum oder warum nicht
const
Zweitens, wenn Sie sich wirklich mit einigen der Argumente "pro" vs "con" befassen möchten, lesen Sie die Diskussion unter diesem "Bug for Enhancement (RFE)" Bug ". Diese RFE fordert eine Funktion "const" vom Typ "Nur lesbare Referenz" an. Das 1999 eröffnete und 2005 von Sun geschlossene / abgelehnte Thema "const" wurde heftig diskutiert:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4211070
Obwohl es auf beiden Seiten viele gute Argumente gibt, sind einige der oft zitierten (aber nicht unbedingt zwingenden oder eindeutigen) Gründe dagegen
const
:const
bedeutet oben)Bevor jemand versucht, mich darüber zu diskutieren, ob dies gute oder schlechte Gründe sind, beachten Sie, dass dies nicht meine Gründe sind . Sie sind einfach der "Kern" einiger der Gründe, die ich aus dem Überfliegen der RFE-Diskussion gezogen habe. Ich stimme ihnen nicht unbedingt selbst zu - ich versuche nur zu zitieren, warum manche Leute (nicht ich) der Meinung sind, dass ein
const
Keyword keine gute Idee ist. Persönlich würde ich es lieben, wenn mehr "const" -Semantik eindeutig in die Sprache eingeführt würde.quelle
volatile
so einfach zu verstehen? Oderfinal
? Meh.const
in C ++ bedeutet nicht, dass ein Wert eine Konstante ist.const
in C ++ bedeutet, dass der Kunde eines Vertrags verpflichtet ist, seinen Wert nicht zu ändern.Ob sich der Wert eines
const
Ausdrucks ändert, wird deutlicher, wenn Sie sich in einer Umgebung befinden, die threadbasierte Parallelität unterstützt.Da Java von Anfang an so konzipiert wurde, dass es die Parallelität von Threads und Sperren unterstützt, trug es nicht zur Verwirrung bei, indem der Begriff überladen wurde, um die Semantik zu haben, die vorhanden
final
ist.z.B:
Ausgänge 42 dann 7.
Obwohl
x
markiertconst
, da ein nichtx
konstanter Alias erstellt wird, ist dies keine Konstante. Nicht jeder Compiler benötigtvolatile
dieses Verhalten (obwohl jeder Compiler die Konstante einbinden darf).Bei komplizierteren Systemen erhalten Sie Konstanten- / Nicht-Konstanten-Aliase ohne Verwendung von.
const_cast
Daher wird es immer gefährlicher, sich vorzustellen, dass Konstante bedeutet, dass sich etwas nicht ändert.const
bedeutet lediglich, dass Ihr Code ihn nicht ohne Umwandlung ändern kann, nicht, dass der Wert konstant ist.quelle
const
bedeutet dies nicht, dass ein Wert konstant ist. Dies bedeutet, dass der Client eines Werts gezwungen ist, ihn nicht zu mutieren. In Ihrem Beispiel gibt es keinen Alias, sodass alle Benutzer derselben Einschränkung unterliegen. Dies ist im Allgemeinen nicht der Fall.const
wirkt sich auf die Kunden aus, nicht auf den Wert - es heißt, Sie können ihn nicht ändern, nicht, dass er sich nicht ändert.immutable interface
undimmutable object
sind eine andere Möglichkeit (mit Besetzung und Reflexion zu schlagen), um const in Java nachzuahmen. "True" const kann mit SealedObject ausgeführt werden , leider zerstört es den Anwendungsfall unseres Objekts.Dies ist eine alte Frage, aber ich dachte, ich würde trotzdem meine 2 Cent beisteuern, da dieser Thread heute im Gespräch auftauchte.
Dies antwortet nicht genau, warum es keine Konstante gibt. aber wie Sie Ihre Klassen unveränderlich machen. (Leider habe ich noch nicht genug Ruf, um als Kommentar zur akzeptierten Antwort zu posten)
Um die Unveränderlichkeit eines Objekts zu gewährleisten, müssen Sie Ihre Klassen sorgfältiger gestalten, damit sie unveränderlich sind. Dies erfordert etwas mehr Sorgfalt als eine veränderbare Klasse.
Dies geht zurück auf Josh Blochs effektives Java- Element 15 - Mutabilität minimieren . Wenn Sie das Buch nicht gelesen haben, nehmen Sie eine Kopie und lesen Sie sie einige Male durch. Ich garantiere, dass es Ihr figuratives "Java-Spiel" verbessern wird .
In Punkt 15 schlägt Bloch vor, die Veränderbarkeit von Klassen einzuschränken, um den Status des Objekts sicherzustellen.
Um das Buch direkt zu zitieren:
Bloch beschreibt dann, wie Sie Ihre Klassen unveränderlich machen, indem Sie 5 einfache Regeln befolgen:
final
).final
.private
.Für weitere Informationen empfehle ich dringend, eine Kopie des Buches abzuholen.
quelle
Die C ++ - Semantik von unterscheidet
const
sich stark von Javafinal
. Wenn die Designer verwendet hättenconst
, wäre es unnötig verwirrend gewesen.Die Tatsache, dass
const
es sich um ein zurückhaltendes Wort handelt, deutet darauf hin, dass die Designer Ideen für die Implementierung hattenconst
, sich aber inzwischen dagegen entschieden haben. siehe diesen geschlossenen Fehler . Zu den genannten Gründen gehört, dass das Hinzufügen von Unterstützung für den C ++ - Stilconst
zu Kompatibilitätsproblemen führen würde.quelle
Es gibt eine Möglichkeit, "const" -Variablen in Java zu erstellen, jedoch nur für bestimmte Klassen. Definieren Sie einfach eine Klasse mit endgültigen Eigenschaften und unterordnen Sie sie. Verwenden Sie dann die Basisklasse, in der Sie "const" verwenden möchten. Wenn Sie "const" -Methoden verwenden müssen, fügen Sie diese ebenfalls der Basisklasse hinzu. Der Compiler erlaubt Ihnen nicht, die seiner Meinung nach endgültigen Methoden der Basisklasse zu ändern, sondern liest und ruft Methoden in der Unterklasse auf.
quelle
Es gibt zwei Möglichkeiten, Konstanten zu definieren -
const
und zwarstatic final
mit genau derselben Semantik. Des Weiterenstatic final
beschreibt das Verhalten besser alsconst
quelle
static
(gehört nicht zu einer bestimmten Instanz) undfinal
- kann nicht geändert werden.Sie können static final verwenden, um etwas zu erstellen, das Const ähnelt. Ich habe dies in der Vergangenheit verwendet.
quelle