Ho un pezzo di codice in cui un'interfaccia ha un metodo di ritorno opzionale e alcune delle classi che lo implementano per restituire qualcosa, altri no.Java 8 opzionale aggiungi risultato di ritorno solo se opzionale.isPresent
Nel tentativo di abbracciare questo brillante "killer null", qui è quello che ho provato:
public interface Gun {
public Optional<Bullet> shoot();
}
public class Pistol implements Gun{
@Override
public Optional<Bullet> shoot(){
return Optional.of(this.magazine.remove(0));
}//never mind the check of magazine content
}
public class Bow implements Gun{
@Override
public Optional<Bullet> shoot(){
quill--;
return Optional.empty();
}
}
public class BallisticGelPuddy{
private Gun[] guns = new Gun[]{new Pistol(),new Bow()};
private List<Bullet> bullets = new ArrayList<>();
public void collectBullets(){
//here is the problem
for(Gun gun : guns)
gun.shoot.ifPresent(bullets.add(<the return I got with the method>)
}}
Mi scuso per quanto sciocco questo esempio è.
Come posso controllare il reso appena ricevuto e aggiungerlo solo se presente, usando opzionale?
P.S. c'è qualche utilità reale a Opzionale che è se (X! = null) non potesse fare?
"P.S. C'è qualche utilità reale a Opzionale che è se (X! = Null) non potrebbe fare?" - Sono un grande fan di Optional, ma allo stesso tempo lo considero quasi una forma di commento.Quando vedi qualcosa di facoltativo, dovresti automaticamente * sapere * che potrebbe non esserci; tuttavia, la maggior parte dei valori che * può * contenere null mai * dovrebbe *, quindi non è pratica generale circondare assolutamente ogni de-riferimento con assegni nulli. –
@EdwardPeters Non voglio trasformare questo in una sorta di bagno di sangue, ma sono d'accordo con [questo ragazzo qui] (http://huguesjohnson.com/programming/java/java8optional.html): qual è il punto? Sono d'accordo sull'impressione "Oh, un optional! Meglio essere sicuri che effettivamente esiste", ma penso che avrebbe potuto essere un po 'meglio. – Vale
Quindi, parte del beneficio che vedo è la chiarezza. Ogni volta che viene visualizzato il messaggio 'Opzionale' a cui viene assegnato un valore' nullo', * si sa * che è sbagliato e potrebbe sentirsi giustificato nel risolverlo. Quando vedi null viene assegnato ad un altro valore ... beh, chissà, forse è appropriato. Sento anche che, filosoficamente, "Cosa che potrebbe essere nulla" dovrebbe essere davvero un tipo diverso da "Cosa che deve essere qualcosa". Potrebbe essere fatto meglio, ma solo se fosse parte del linguaggio da zero ... e, IMO, Java è composto da una parte di maiale e tre parti di rossetto. –