Rzeczywiście wydaje się śmierdzący i bez większego kontekstu nie można tego powiedzieć na pewno. Mogą to być dwa powody, chociaż istnieją alternatywy dla obu.
Po pierwsze, jest to zwięzły sposób na implementację częściowej konwersji lub pozostawienie wyniku z wartościami domyślnymi, jeśli konwersja się nie powiedzie. Oznacza to, że możesz mieć to:
public void ConvertFoo(Foo from, Foo to) {
if (can't convert) {
return;
}
...
}
Foo a;
Foo b = DefaultFoo();
ConvertFoo(a, b);
// If conversion fails, b is unchanged
Oczywiście zwykle odbywa się to za pomocą wyjątków. Jednak nawet jeśli z jakiegokolwiek powodu należy unikać wyjątków, istnieje na to lepszy sposób - wzorzec TryParse jest jedną z opcji.
Innym powodem może być czysta spójność, na przykład jest to część publicznego interfejsu API, w którym ta metoda jest używana do wszystkich funkcji konwersji z dowolnego powodu (takich jak inne funkcje konwersji posiadające wiele danych wyjściowych).
Java nie jest świetna w radzeniu sobie z wieloma wyjściami - nie może mieć parametrów tylko wyjściowych, takich jak niektóre języki, ani mieć wielu wartości zwracanych, jak inne - ale nawet można użyć obiektów zwracanych.
Powód spójności jest raczej kiepski, ale niestety może być najczęstszy.
- Być może stylowi gliniarze w twoim miejscu pracy (lub twojej bazie kodu) pochodzą z środowisk innych niż Java i niechętnie się zmieniają.
- Twój kod mógł być portem z języka, w którym ten styl jest bardziej idiomatyczny.
- Twoja organizacja może być zmuszona do zachowania spójności interfejsu API w różnych językach, a był to styl o najniższym wspólnym mianowniku (to głupie, ale zdarza się nawet w Google ).
- A może styl był bardziej sensowny w odległej przeszłości i przekształcił się w obecną formę (na przykład mógł to być wzór TryParse, ale jakiś dobrze intonowany poprzednik usunął wartość zwracaną po odkryciu, że nikt jej wcale nie sprawdził).