Parlando come sviluppatore Guava, vorrei provare a decomprimere la logica qui. Rispondendo sia alla domanda originale, sia alla discussione del commento direttamente sulla domanda:
È assolutamente il caso che cerchiamo di costringere gli utenti di Guava a rispettare i nostri standard di buone abitudini di programmazione. (I nostri standard sono fortemente influenzato da esempio Effective Java.)
Detto questo, sono d'accordo che ci sono perfettamente buoni casi di utilizzo per il comportamento ti riferisci in questa particolare domanda: "se assente, un'eccezione ". Forse stai implementando una classe a cui è possibile accedere in entrambi i modi: un metodo con un valore di ritorno Opzionale e un metodo che presuppone che il valore sarà sempre presente, generando altrimenti un'eccezione. L'interfaccia di Deque, ad esempio, fornisce versioni a valore speciale e di eccezione per peek, poll e offerte.
Tutto ciò che ha detto, al meglio della mia comprensione, il Vero Guava modo per farlo è ...
if (value.isPresent()) {
return value.get();
} else {
throw new MyException();
}
Il metodo "orThrow" proponi richiede una riflessione (!!), non lo fa ti consente di personalizzare l'eccezione con un messaggio utile, ecc. Il "modo normale" è perfettamente leggibile e più efficiente.
A volte Guava non fornisce supporto esplicito per le cose, perché per quei casi d'uso, pensiamo che sia meglio fare solo il "modo normale". Penso che questo sia il caso qui.
fonte
2011-12-17 16:52:22
Domanda generale. Se la cosa che stai verificando è Opzionale, non è contrario al concetto di "facoltativo" avere un metodo come "Optional.orThrow"? –
Totalmente d'accordo. Se 'isAbsent' (aggiunto nella versione 11) è una condizione valida, non dovrebbe comportare un'eccezione. Il punto di "Optional" è che l'assenza è un caso valido non eccezionale. Se assente è un caso eccezionale, il tuo metodo dovrebbe solo restituire l'oggetto e gettare ed eccezione nel caso assente. –
panda nero: allora perché posso dare un valore predefinito con il metodo 'or()'? È un tipo di consentire un comportamento predefinito, perché non un altro? @ John B: uno dei casi d'uso è un estrattore di attributi XML piuttosto generico: quell'attributo può essere o non essere presente, quindi il metodo restituisce un 'Optional'. Quindi il chiamante potrebbe voler imporre la presenza del valore (lanciando un'eccezione), oppure ottenere il valore, se presente, o persino recuperare un valore predefinito. Il metodo estrattore semplicemente non sa cosa vuole fare il chiamante con il valore, quindi deve restituire un 'Optional'. Perché questo caso d'uso non sarebbe valido? –