2015-03-13 15 views
5

Ho letto qualcosa sullo scopo di Optional (sfortunatamente non ricordo dove) in Java 8 e sono rimasto sorpreso che lo scrittore non abbia menzionato l'uso di uno Optional come attributo in una classe.È consigliabile utilizzare Opzionale come attributo in una classe?

Dal momento che sto usando gli optionals piuttosto frequentemente nelle mie lezioni, mi chiedevo se questa fosse una buona pratica. O potrei usare semplicemente gli attributi normali, che restituiscono null quando non sono impostati?

Nota: Può sembrare la mia domanda è basata opinione, ma ho la sensazione utilizzando Optional in una classe è in realtà non è il modo di andare (dopo aver letto il post citato). Tuttavia, mi piace usarlo e non riesco a trovare alcun svantaggio di usarlo.

Esempio

desidero dare un esempio per chiarire. Ho una classe Transaction, che è costruito in questo modo:

public class Transaction { 

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

vs

public class Transaction { 

    private Customer = null; 
    .... 

Durante il controllo su un Customer, penso che sia più logico utilizzare transaction.getCustomer().isPresent() di transaction.getCustomer() != null. Secondo me il primo codice è più pulito del secondo.

+0

@AdamSiemion Stiamo parlando di 'Optional' di Guava o' Optional' di Java 8 qui? – Jesper

+0

@AdamSiemion Grazie per il link! Non sono così esperto, quindi non sapevo che Guava lo avesse già. Tuttavia, la ragione principale menzionata è che "Optional" ha tre possibilità: presente, assente e nulla. Java 8 è così assente, quindi quell'argomento non è più valido .. – bashoogzaad

+0

@bashoogzaad Se ci sono tre (null, assente, presente) o due opzioni (null/empty, present) non cambia lo scopo di 'Optional' . –

risposta

14

di Java 8 Optional era destinato principalmente per i valori restituiti da metodi, e non per le proprietà di classi Java, come descritto in Optional in Java SE 8:

Naturalmente, la gente fare ciò che vogliono. Ma avevamo una chiara intenzione quando aggiungevamo questa funzione, e non doveva essere un tipo generale Maybe o Some, così come molte persone avrebbero voluto che facessimo. La nostra intenzione era quella di fornire un meccanismo limitato per i tipi di restituzione del metodo di libreria in cui doveva essere un modo chiaro per rappresentare "nessun risultato" e l'utilizzo di null per tali motivi era estremamente probabile che causasse errori.

La chiave qui è l'attenzione sull'uso come tipo di ritorno. La classe non è definitivamente concepita per l'utilizzo come proprietà di un bean Java. Il testimone di questo è che Optional non implementa Serializable, che è generalmente necessario per l'uso diffuso come una proprietà di un oggetto.

+0

Grazie per la tua risposta! È molto utile sapere cosa intendevano i creatori con 'Optional'. L'argomento sull'implementazione di 'Serializable' non mi è del tutto chiaro, ma è colpa mia, perché non lo uso. – bashoogzaad

+4

La cosa divertente del blog che hai collegato è che la parte che hai citato è una citazione [una risposta StackOverflow] (http://stackoverflow.com/a/26328555/2711488) – Holger

0

Penso che sia una domanda teorica.

La nozione di valori facoltativi è stata portata dal mondo delle lingue funzionali. Queste lingue di solito supportano anche la corrispondenza dei modelli a livello di lingua e consentono di associare il modello al valore opzionale.

Nelle chiamate di funzione, le chiamate in genere restituiscono un valore facoltativo su cui altri modelli potrebbero corrispondere.

Non ho mai visto passare un argomento opzionale come argomento, ma ciò non significa che sia un cattivo pensiero. Sembra strano però.

+0

Grazie per la risposta! Capisco che sia particolarmente utile nelle espressioni lambda, e se ti capisco correttamente, pensi anche che sia una buona pratica usarlo come attributo? – bashoogzaad

Problemi correlati