2015-03-13 6 views
5

Ich habe etwas über den Zweck von Optional gelesen (leider erinnere ich mich nicht wo) in Java 8, und ich war überrascht, dass der Schriftsteller die Verwendung eines Optional als Attribut in einer Klasse nicht erwähnt.Ist es empfehlenswert, Optional als Attribut in einer Klasse zu verwenden?

Da ich in meinen Kursen ziemlich häufig Optionals verwende, habe ich mich gefragt, ob das eine gute Übung ist. Oder könnte ich besser nur normale Attribute verwenden, die null zurückgeben, wenn sie nicht gesetzt sind?

Hinweis: Es ist wie meine Frage aussehen Meinung basiert, aber ich habe das Gefühl, Optional in einer Klasse verwendet, ist wirklich nicht der Weg zu gehen (nach dem erwähnten Beitrag lesen). Aber ich benutze es gerne und finde keinen Nachteil, es zu benutzen.

Beispiel

Ich möchte ein Beispiel geben zu klären. Ich habe eine Klasse Transaction, die wie folgt aufgebaut ist:

public class Transaction { 

    private Optional<Customer> = Optional.empty(); 
    .... 

vs

public class Transaction { 

    private Customer = null; 
    .... 

Wenn auf einem Customer Kontrolle, ich denke, es logischste ist transaction.getCustomer().isPresent() als transaction.getCustomer() != null zu verwenden. Meiner Meinung nach ist der erste Code sauberer als der zweite.

+0

@AdamSiemion Sprechen wir über Guavas 'Optional' oder Java's' Optional' hier? – Jesper

+0

@AdamSiemion Danke für den Link! Ich bin nicht so erfahren, also wusste ich nicht, dass Guava es bereits hatte. Der Hauptgrund, der dort erwähnt wird, ist jedoch, dass "Optional" drei Möglichkeiten hat: Gegenwart, Abwesenheit und Null. Java 8 ist nicht mehr vorhanden, so dass dieses Argument nicht mehr gültig ist. – bashoogzaad

+0

@bashoogzaad Ob es drei (null, abwesend, vorhanden) oder zwei Optionen (null/leer, vorhanden) gibt, ändert nicht den Zweck von 'Optional' . –

Antwort

14

Java 8 des Optional hauptsächlich für Rückgabewerte von Methoden bestimmt war, und nicht für die Eigenschaften von Java-Klassen, wie in Optional in Java SE 8 beschrieben:

Natürlich werden die Menschen tun, was sie wollen. Aber wir hatten eine klare Absicht, wenn wir dieses Feature hinzufügten, und es sollte kein allgemeiner Zweck sein, so viele Leute es uns gewünscht hätten. Unsere Absicht war es, einen begrenzten Mechanismus für die Rückgabetypen der Bibliotheksmethode bereitzustellen, wo ein klarer Weg zur Darstellung von "kein Ergebnis" benötigt wurde, und die Verwendung von null für solche Fehler mit überwältigender Wahrscheinlichkeit Fehler verursachte.

Der Schlüssel hier ist der Fokus auf die Verwendung als Rückgabetyp. Die Klasse ist definitiv nicht zur Verwendung als Eigenschaft eines Java-Beans gedacht. Zeuge ist, dass OptionalSerializable implementiert, die in der Regel für die weit verbreitete Verwendung als eine Eigenschaft eines Objekts erforderlich ist.

+0

Danke für Ihre Antwort! Es ist wirklich hilfreich zu wissen, was die Schöpfer mit 'Optional' beabsichtigten. Das Argument über die Implementierung von 'Serializable' ist mir nicht völlig klar, aber das ist mein Fehler, weil ich es nicht benutze. – bashoogzaad

+4

Die lustige Sache über den Blog, den du verlinkt hast, ist, dass der Teil, den du zitiertest, eine Anspielung auf [eine StackOverflow-Antwort] ist (http://stackoverflow.com/a/26328555/2711488) – Holger

0

Ich denke, es ist eine theoretische Frage.

Der Begriff der optionalen Werte wurde aus der Welt der funktionalen Sprachen gebracht. Diese Sprachen unterstützen in der Regel auch die Mustererkennung auf Sprachenebene und ermöglichen die Musteranpassung für den optionalen Wert.

In Funktionssprachen geben Funktionsaufrufe normalerweise einen optionalen Wert zurück, mit dem anderer Code übereinstimmen könnte.

Ich habe noch nie ein optionales Argument als Argument gesehen, aber das bedeutet nicht, dass es ein schlechtes Denken ist. Es sieht jedoch komisch aus.

+0

Vielen Dank für Ihre Antwort! Ich verstehe, dass es besonders nützlich ist, zB in Lambda-Ausdrücken, und wenn ich Sie richtig verstehe, denken Sie auch, dass es eine gute Übung ist, es als Attribut zu verwenden? – bashoogzaad

Verwandte Themen