Załóżmy, że mam metodę biblioteki tak (bardzo skrótowo):Co powrócić, gdy metody generyczne zwracają "nic", ale wartość null nie może zostać zwrócona?
public static <V> Optional<V> doSomethingWith(Callable<V> callable) {
try {
return Optional.of(callable.call());
} catch (Exception ex) {
// Do something with ex
return Optional.empty();
}
}
I chcę coś, co nie zwraca wartości, jak:
Library.</*What1*/>doSomethingWith(() -> {
foo();
return /*what2*/;
});
Mój pierwszy instynkt rodzajowy metoda, która nie zwraca wartości, tworzy typ Void
i zwraca null
, jednak ponieważ wynik zostanie zawinięty w Optional
, to spowodowałoby to wyjątek.
Jakie są uzasadnione elementy zastępcze dla /*What1*/
i /*what2*/
, które nie wyglądają zupełnie przypadkowo, jak Integer
i 0
?
[edytuj] Próbuję uniknąć Optional.ofNullable
, ponieważ puste jest używane tutaj, aby wskazać, że callable.call()
nie zakończyło się normalnie.
Nie można zmienić metody biblioteki, aby użyć opcji "Opcjonalny.Niewylny"? Jaki jest sens, aby zwrócić opcjonalne, jeśli jest zawsze obecny? –
Metoda biblioteczna jest bardzo skrócona. W rzeczywistości może zwrócić 'Opcjonalny.empty()', gdy wystąpi warunek. –
Można po prostu dodać lokalną klasę o rozsądnie określonej nazwie i zwrócić instancję tej klasy. – glee8e