Optional Geben Sie einen Nullwert zurückgibt
Habe ich eine Klasse wie dieses.
public class SomeClass {
private Optional<String> testString;
public SomeClass() {
populateFields();
}
public Optional<String> getTestString() {
return testString;
}
private void populateFields() {
if(//something is going false here){
testString = functionThatReturnsOptionalString();
}
}
}
Nun instanceOfSomeClass.getTestString() null zurück. Ist nicht Optional immer enthalten soll, eine nicht-null-Wert oder leer sein? Ich bin versucht, oder vermeiden Sie die isNull() und benutzen Sie einfach isEmpty() in meinem Anrufer.
Wenn ich einen Haltepunkt auf die erste Zeile der populateFields() und prüfen Sie den Wert testString zu dieser Zeit, es zeigt den Wert als null. Bedeutung der Standardwert für dieses Feld(bevor Sie zugewiesen wird, nichts) ist null.
Bitte werfen Licht auf diese situation; und vielleicht die korrekte Verwendung von Optional?
Könnten Sie initialisieren die
Oder vielmehr, Sie mit der statischen factory-Methode:
Es ist keine Besondere Magie für Optional - es ist eine Klasse wie jede andere. Das bedeutet, dass der Standardwert für den Optionalen Referenzen (wie alle Referenzen) ist null.
testString
: private Optional<String> testString = new Optional...
Oder vielmehr, Sie mit der statischen factory-Methode:
Optional.absent()
wenn Sie mit Guave Optionen oder Optional.empty()
für Java 8 Optionen.Es ist keine Besondere Magie für Optional - es ist eine Klasse wie jede andere. Das bedeutet, dass der Standardwert für den Optionalen Referenzen (wie alle Referenzen) ist null.
InformationsquelleAutor Gadam | 2015-03-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Optional enthält immer einen Wert ungleich null oder leer ist, ja, aber Sie haben nicht Optional, Sie haben einen Verweis vom Typ Optional zeigt auf null. Sie initialisiert werden muss
testString
, z.B.Optional.empty()
.Optional
ist keine Zauberei, es ist ein Objekt wie jedes andere, und dieOptional
Referenz selbst kann null sein. Es ist der Inhalt derOptional
kann nicht null sein.Es ist keine Zauberei. Es ist nur eine normale Klasse, die halten kann entweder ein nicht-null-Wert oder leer sein. Nicht sicher, was Sie wollen, ein Beispiel.
"Es ist der Inhalt der Optionalen, kann nicht null sein" - wie wird das durchgesetzt? Was wäre eine illegale Zeile code/compiler-Fehler?
Es ist nicht in den compiler; es löst eine Ausnahme in Optional.wenn Sie übergeben Sie einen null-argument.
Doug ' s Antwort hat mir geholfen viel. Aber diese Antwort ist mehr relevant für die ursprüngliche Frage. So markieren Sie es als Antwort. Danke.
InformationsquelleAutor Louis Wasserman
Mag ich immer speichern, um die internen Felder der Klasse, als Ihre tatsächlichen Werte, und verwenden Sie
return Optional.ofNullable(theField)
in der getter-Methode. Dadurch wird sichergestellt, dass die Methode immer wieder einige optionale. In anderen Wörter, Sie nie in die situation, wo Ihre Methode soll zurückgeben, optional ist die Rückgabe null.Also in deinem Fall:
Zusätzlich zu dem 'nie wieder null nutzen, ist dieser Ansatz sollte auch noch brav bei der Verwendung von Dinge wie Gson zu Marschall Instanzen Ihrer Klasse in ein format wie JSON. Ich habe nicht versucht, Gson mit Java 8 Optionen, aber mit Guaven-Optionen, die Sie nicht serialisieren sehr schön in JSON, ohne eine Art adapter. Wenn Sie die Speicherung der raw-Wert und dann wickelte Sie mit Optionen auf Ihre getter-Methoden, die Sie serialisieren zu JSON in genau der Weise, die Sie erwarten würden.
Naja, das kommt auf das Nutzungsprofil an. Es gibt einen zusätzlichen Objekt-Erstellung Schritt mit meinem Ansatz. In 99,99% der Anwendungen für eine Methode wie diese, das ist nicht so wichtig, aber wenn man den Aufruf dieser Methode 1000 mal pro Sekunde in einem extrem performance-kritischen situation, dieser Ansatz könnte zu teuer werden. Wenn Sie eine Leistung heikle situation, ein Mindest-performance-Schwelle, und Messen Sie die beiden Ansätze zu sehen, ob es eine performance-Gründen nicht zu. Aber in aller Wahrscheinlichkeit Sie sollten nicht verboten werden, von der Leistung
Dank Der Hunde. Dies ist ein big-data-Umfeld, wo dieser code ist Teil einer batch-Programm, das läuft und Prozesse ca 6 Millionen Datensätze täglich (für jetzt). In diesem Zusammenhang sollte ich hin, nur die Initialisierung der testString mit Optional.leeren(); ?
Wird die Methode aufgerufen wird, für all diese Aufzeichnungen? Haben Sie tests, um zu sehen, wenn es zu langsam ist?
Ja eine Instanz von SomeClass ist für jeden Datensatz erstellt. Ich sehe Ihren Punkt, um nicht zu viel von einem performance-Problem, leider habe ich zu prüfen, im code wird nun ohne performance-Tests. Aber dies ist eine großartige Möglichkeit, mit Optionaler, die ich verwenden werde in meinem code weitergehen. Vielen Dank.
InformationsquelleAutor Dogs
Aus der oracle-Dokumentation für das Optionale type :
So, ja, es wird null zurückgegeben, wenn die variable auf null gesetzt ist.
Mehr info hier
InformationsquelleAutor Samuel Rondeau-Millaire
Das ist, weil Ihr zunächst ein Objekt der Klasse
Optional<String>
und der code hat nur eine Referenz TypOptional<String>
. Deklarieren (und zu initialisieren)testString
in der folgenden Weise:Oder mit "diamond-notation":
Nun haben Sie ein
Optional
!InformationsquelleAutor Mario Rossi
Aus der Java-Dokumentation:
Obwohl der Konstruktor der YourClass nicht instanziieren der Optionale Klasse, die ist, warum es null ist.
Quelle: http://docs.oracle.com/javase/8/docs/api/java/util/Optional.html
Optional
nicht aussetzen Konstruktor; Sie können nichtnew Optional
.InformationsquelleAutor Quanturium