Un buon motivo per usarlo è che rende i tuoi valori nulli molto significativi. Invece di restituire un null che potrebbe significare molte cose (come errore, fallimento, o vuoto, ecc.) Puoi mettere un "nome" al tuo null. Guarda questo esempio:
definiamo un POJO di base:
class PersonDetails {
String person;
String comments;
public PersonDetails(String person, String comments) {
this.person = person;
this.comments = comments;
}
public String getPerson() {
return person;
}
public String getComments() {
return comments;
}
}
Ora usiamo questo semplice POJO:
public Optional<PersonDetails> getPersonDetailstWithOptional () {
PersonDetails details = null; /*details of the person are empty but to the caller this is meaningless,
lets make the return value more meaningful*/
if (details == null) {
//return an absent here, caller can check for absent to signify details are not present
return Optional.absent();
} else {
//else return the details wrapped in a guava 'optional'
return Optional.of(details);
}
}
Ora evitiamo di usare null e facciamo i nostri controlli con Opzionale, quindi è significativo
public void checkUsingOptional () {
Optional<PersonDetails> details = getPersonDetailstWithOptional();
/*below condition checks if persons details are present (notice we dont check if person details are null,
we use something more meaningful. Guava optional forces this with the implementation)*/
if (details.isPresent()) {
PersonDetails details = details.get();
// proceed with further processing
logger.info(details);
} else {
// do nothing
logger.info("object was null");
}
assertFalse(details.isPresent());
}
quindi alla fine è un modo per rendere i valori nulli significativi e meno ambigui.