Um bom motivo para usá-lo é que torna seus valores nulos muito significativos. Em vez de retornar um nulo que pode significar muitas coisas (como erro, falha ou vazio, etc), você pode colocar um 'nome' em seu nulo. Veja este exemplo:
vamos definir um POJO básico:
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;
}
}
Agora vamos usar este POJO simples:
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);
}
}
Agora vamos evitar o uso de nulo e fazer nossas verificações com Opcional para que seja 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());
}
portanto, no final, é uma maneira de tornar os nulos significativos e menos ambigüos.