Mówiąc jako programista Guava, pozwól mi spróbować rozpakować logikę tutaj. Odpowiadając zarówno na oryginalne pytanie, jak i na wątek komentarza bezpośrednio na pytanie:
To jest absolutnie przypadek, że staramy się zmusić użytkowników Guava do przestrzegania naszych standardów dobrych nawyków programistycznych. (Nasze standardy są silnie wpływem np Effective Java.)
To powiedziawszy, zgadzam się, że istnieją przypadki użycia doskonale dobre dla zachowania masz na myśli w tym konkretnym pytaniem: „czy nieobecne, wyjątek . " Być może implementujesz klasę, do której można uzyskać dostęp w obie strony - jedną metodę z Opcjonalną wartością zwracaną i jedną metodę, która zakłada, że wartość będzie zawsze obecna, rzucając wyjątek inaczej. Na przykład interfejs Deque oferuje wersje o specjalnej wartości i rzucające wyjątki, peek, poll i offer.
Wszystkie powiedział, że najlepiej, moim rozumieniu, prawdziwy Guava Droga do tego jest ...
if (value.isPresent()) {
return value.get();
} else {
throw new MyException();
}
W „orThrow” metoda proponujesz wymaga refleksji (!!), nie pozwala dostosować wyjątek za pomocą użytecznego komunikatu itp. "Normalny sposób" jest doskonale czytelny i bardziej wydajny.
Czasami Guava nie zapewnia wyraźnego wsparcia dla rzeczy, ponieważ w przypadku tych przypadków uważamy, że najlepiej jest zrobić "normalny" sposób. Myślę, że tak jest w tym przypadku.
Pytanie ogólne. Jeśli sprawdzana jest opcja Opcjonalna, czy nie jest to sprzeczne z koncepcją "opcjonalnie", aby mieć metodę taką jak "Opcjonalny.orowy"? –
Całkowicie się zgadzam. Jeśli "isAbsent" (dodany w wersji 11) jest poprawnym warunkiem, nie powinno powodować wyjątku. Punkt "Opcjonalny" oznacza, że nieobecność jest ważnym, nie wyjątkowym przypadkiem. Jeśli nieobecność jest wyjątkowa, twoja metoda powinna po prostu zwrócić przedmiot i rzut i wyjątek w nieobecnym przypadku. –
@ black panda: dlaczego mogę podać wartość domyślną za pomocą metody 'or()'? Jest to rodzaj pozwalający na zachowanie domyślne, dlaczego nie inne? @ John B: Jednym z przypadków użycia jest dość ogólny ekstraktor atrybutów XML: ten atrybut może być obecny lub nie, więc metoda zwraca wartość "Opcjonalnie". Następnie wywołujący może wymusić obecność wartości (rzucając wyjątek), lub uzyskać wartość, jeśli istnieje, lub nawet pobrać wartość domyślną. Metoda ekstraktora po prostu nie wie, co osoba wywołująca chce zrobić z wartością, więc musi zwrócić wartość "Opcjonalnie". Dlaczego ten przypadek użycia byłby nieważny? –