Wie soll ich das deklarieren Sie eine Konstante sichtbar, die für jede Instanz der Klasse?
Ich würde gerne eine Konstante in meiner Klasse, die sichtbar sein würde, die für alle Instanzen der Klasse.
Ersten, ich weiß nicht, ob ich brauche, um zu erklären Sie als "static". Soweit ich das verstanden habe, bei änderungen ein statisches Feld (eine der Instanzen) gesehen werden, die von anderen Instanzen (also statische variable ist nicht gebunden an eine bestimmte Instanz). Darüber hinaus wird ein statisches Feld kann Veränderungen ohne Einsatz von Instanz (wir arbeiten direkt mit der Klasse). So, alle diese speziellen Eigenschaften des statischen Feldes im Zusammenhang mit der Art und Weise wie es verändert werden kann und was werden die Auswirkungen dieser änderungen. Aber in meinem Fall möchte ich eine Konstante (also die "änderungen" Fragen sind hier nicht relevant). So, wahrscheinlich brauche ich mich nicht zu verwenden, "static". Richtig?
Zweiten, in meinem set enthalten eine Menge von Elementen und ich möchte nicht, definieren Sie den Wert der auf einmal (wenn ich eine variable anlegen). In anderen Worten möchte ich erklären, ein Satz, dann fügen Sie Elemente, um diese Schritt für Schritt. Aber ich kann es nicht tun, wenn ich die Arbeit mit den Konstanten. Ist es möglich zum angegebenen Wert der eingestellt und dann konstant?
Dritten habe ich gemerkt, dass es einige Probleme, wenn ich versuche, ändern Sie den Wert der Variablen außerhalb der Methode. Also, wie funktioniert es?
HINZUGEFÜGT:
OK. Dank der Antwort habe ich verstanden, dass es sein sollte "final" und "static" (da es eine Konstante festgelegt, und es wird nicht verbunden mit einer bestimmten Instanz, es sollte nur sichtbar sein, um alle Instanzen der Klasse). Aber ich habe noch ein problem. Ich wollte angeben das set mit "add" und ich kann hinzufügen, um die eingestellte, wenn es Konstanten (final). Außerdem kann ich nicht ändern Sie die Werte der Variablen außerhalb von Methoden (warum?). Wie auch immer, ich glaube nicht darauf bestehen, auf die Verwendung von "hinzufügen", um das Setup zu definieren. Ich bin bereit, Sie zu definieren, es auf einmal. Aber ich weiß nicht, wie es zu tun. Ich habe versucht, Dinge wie, dass:
final static Set allowedParameters = new HashSet("aaa","bbb");
final static Set allowedParameters = new HashSet(["aaa","bbb"]);
final static Set allowedParameters = new HashSet({"aaa","bbb"});
final static Set allowedParameters = new HashSet(Arrays.asList({"userName"}));
Und Sie hat nicht funktioniert.
HINZUGEFÜGT 2:
Kann jemand mir erklären, bitten, den code von Tadeusz Kopec?
class YourClass {
private static void fillSet(Set<SomeType> set) {
//here you add elements, like
set.add(new SomeType());
}
private final static Set<SomeType> yourSetField;
static {
final Set<SomeType> tempSet = new HashSet<SomeType>();
fillSet(tempSet);
yourSetField = Collection.unmodifiableSet(tempSet);
}
}
1. Die fillSet
Methode eine variable mit dem Namen "set". Warum ist es nicht in die Methode?
2. Was ist SomeType()
im fillSet
? Was macht diese Methode?
3. Was bedeutet fillSet
tun? Später im Beispiel geben wir eine leere Menge zu dieser Methode. Was für?
4. Was für die tun wir erklären tempSet
als final?
5. Was genau unmodifiableSet
tun? Nach den Namen generieren Sie ein set, das nicht geändert werden kann, denke ich. Aber warum sollte es nicht ausreichen, zu erklären yourSetField
als final
? Als wäre es konstant zu.
"Ich möchte nicht, definieren Sie den Wert der auf einmal". Was bedeutet das? Sie wollen in der Lage sein, um die Menge in Zukunft?
Ja.
Ich meinte, dass ganz am Anfang von meinem Programm, das ich angeben möchten, legen Sie durch hinzufügen von neuen Elementen (Schritt für Schritt). Nach, dass ich nicht wollen, ändern Sie den Satz nicht mehr. So, dann möchte ich nicht in der Lage sein, um hinzuzufügen, um den Satz in die Zukunft.
Verwenden Sie einen statischen Initialisierer block. Blick auf meine Antwort.
InformationsquelleAutor Roman | 2010-03-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Möchten Sie zum hinzufügen von Elementen zu Ihrer einmalig eingestellt und dann nur den Inhalt gelesen oder wollen Sie Sie in der Lage sein, das hinzufügen von Elementen, um es zu jeder Zeit? Wenn Sie es schaffen, einmal, tun Sie es wie diese:
Nun - es ist privat, so dass niemand außerhalb der Klasse darauf zugreifen. Und seine unveränderbar, so kann niemand ändern Sie dessen Inhalt.
Wenn Sie möchten, fügen Sie Elemente zu jeder Zeit haben Sie eine concurrency-problem - Lesen extraneon Antwort.
BEARBEITEN
Wie beantragt ich erkläre, was dieser code tut.
Erste - geheimnisvoll <> Klammern:
Ich nahm Sie mit Java 1.5 oder höher und verwendet Generika. In wenigen Worten - wenn Sie eine variable deklarieren vom Typ Liste, es hält Gegenstände. Wenn Sie Sie behalten möchten Zeichenfolgen, die Sie haben, um Sie zu werfen, wenn Sie Sie abrufen, Sie aus Ihrer Liste. Beispiel
Den cast zu String erforderlich ist. Außerdem nichts hindert Sie daran, hinzufügen von BigDecimal zu myList. Aber wenn Sie Sie abrufen und versuchen zu casten zu einem String, Sie bekommen classcastexception-Fehler.
Also Java 1.5 eingeführt Generika. Sie können angeben, dass kann die Liste enthält nur Zeichenfolgen. Syntax benutzt <> Klammern:
Gleiche gilt auch für andere Sammlungen, wie die Sets. Ich schrieb über Listen, weil das abrufen von Listen ist bequemer. Ich verwendet
SomeType
in meinem Beispiel, weil ich nicht wusste, was Sie behalten möchten, in Ihrem Set. Ersetzen Sie es mit dem Typ der Objekte, die Sie speichern möchten.Jetzt - statische Blöcke. Es gibt zwei Möglichkeiten zum initialisieren einer statischen Felder - direkt in Ihrer Erklärung:
Dies ist nützlich, wenn der erste Wert ist ein einfacher Ausdruck.
Oder in statischen Initialisierungs-block
Dies ist nützlich, wenn der anfängliche Wert für einige statische Felder braucht etwas mehr komplizierte Berechnungen.
Und jetzt Ihre Fragen
set
vonfillSet
verwendet wird. Es ist ein element, das Hinzugefügt:set.add(new SomeType());
SomeType
. Sie ist zu ersetzen mit dem Typ, den Sie verwenden möchten.new SomeType();
erstellt eine Instanz von (hypothetischen)SomeType
Aufruf der parameterlosen Konstruktor.fillSet
genau das tut, was sein name bedeutet - nimmt einen Satz und füllt es (fügt einige Werte). Wir geben einen leeren Wert gesetzt, so dass als Ergebnis erhalten wir ein set mit ElementenfillSet
hat.fillSet
ist ein Ort, wo sollte man den code, der initialisiert Ihr set. Ist es gut, wenn diese voneinander getrennt werden.tempSet
ist eine lokale variable in static initialization block zugewiesen ist einmal und nie zugewiesen. Um dies auszudrücken erkläre ich es endgültig. Es ist eine Gewohnheit, die ich von der Verwendung findBugs und ich denke, es ist gut für die Lesbarkeit.yourSetField = new HashSet<SomeType>()
sobald es initialisiert wird. Aber wer ZugangyourSetField
schreiben kannyourSetField.add(...)
. WennyourSetField
ist ein unmodifiableSet, indem es zu einer Ausnahme führen, in der runtime (UnsupportedOperationException
). In anderen Worten: final bedeutet, dass Sie nicht machenyourSetField
Punkt zu einem anderen Objekt (und der compiler garantiert). unmodifiableSet bedeutet, Sie können nicht hinzufügen oder entfernen von Objekten aus dem set. Es kompiliert, aber brechen in der runtime.static {...}
bedeutet. Ich dachte immer, dass es nur ein Modifikator für Felder und Methoden. Aber anscheinend ist es nicht der Fall ist. Ich verstehe auch nicht diese Art von Sachen<>
. Brauche ich wirklich diese Klammern gibt? Oder Sie zeigen einfach auf, dass es so etwas freiwillig? Ersetze ich SomeType oder <SomeType>?OK. Ich habe die
static block
Zeug.<>
geht noch immer unter die Frage.Die <...> sind ein Teil der Generika-Spezifikation. Wikipedia hat einen guten Artikel: en.wikipedia.org/wiki/Generics_in_Java
Tippfehler in den vorgeschlagenen code: es ist
Collections.unmodifiableSet
(plural), nichtCollection.unmodifiableSet
InformationsquelleAutor Tadeusz Kopec
In Ihrer Klasse, die Sie wollen, so etwas wie:
Ich würde mit dem Guava
ImmutableSet
wie Jon sagt, dann würde Sie mit derof( ... )
- Methode oder die builder-Schnittstelle (wenn Sie irgendeine Art von feed-Daten - wenn Sie hart codierten Daten nur die Verwendung von()), beide sind ziemlich gut abgedeckt, die in der API. Weitere Optionen sind der Verpackung über die unmodifiable-Methode von Collections.InformationsquelleAutor Carl
Es klingt wie Sie tun möchten statischen, nicht, weil, wie Veränderungen angegangen werden, aber weil es nicht spezifisch auf eine Instanz der Klasse.
Ich schlage vor, Sie haben ein Finale statische Variablen und statische Initialisierer block für Ihre Art, die Sie bauen, einen normalen Satz, dann erstellen Sie ein unveränderlich festgelegt (z.B. die eine in Guave) aus dem regulären ein. Zuweisen, unveränderliche Referenz setzen, um Ihre statische Finale Variablen. Job zu erledigen.
Yup, beheben wird.
InformationsquelleAutor Jon Skeet
Ich denke, Sie wissen, was
static
bedeutet. Wie Sie bereits erwähnt Sie den Satz, aber nicht den Inhalt, ist eine "Konstante", dass ist, keine Instanz kann ein anderes Set gibt, würden Sie gut tun, um esfinal
.Einer endgültigen statischen Satz ist die gleiche für alle Instanzen, und die Inhalt diesem Satz kann geändert werden, durch alle Instanzen.
Ist ein anderes problem ergibt sich nun; die Parallelität. Was ist, wenn mehrere Instanzen der Klasse m odify der Satz zur gleichen Zeit? Was soll der Satz? Sie fangen konnte, dass durch das einwickeln von Ihren Satz in einem Synchronisiert Set.
Alles in allem denke ich sollte die Anmeldung Aussehen:
wo die Inhalte, die Sie wissen vorher gefüllt werden kann, die im statischen block als Bozho zeigte, und andere Elemente können Hinzugefügt werden run-time.
Mit dieser Erklärung eine Aussage wie
wird scheitern, wie es tun soll, und gleichzeitige updates auf dem set arbeiten.
Wenn Sie müssen eine Reihe mit Konstanten Werten, die man tun könnte:
Aber ich sehe, jemand anderes war erste 🙂
final static Set nameOfSet = new HashSet("aaa","bbb")
funktionieren nicht.Ich verstehe auch nicht den Unterschied zwischen "konstant" und "konstanter Inhalt des set". Für mich ist es das gleiche. Ich denke, dass set ist Konstante, wenn Ihr Wert (d.h. der Inhalt) ist konstant.
InformationsquelleAutor extraneon