Zwrot null; jest konieczne, ponieważ wyjątek może zostać przechwycony, jednak w takim przypadku, ponieważ już sprawdziliśmy, czy jest on pusty (i załóżmy, że wiemy, że klasa, którą wywołujemy, obsługuje klonowanie), więc wiemy, że instrukcja try nigdy nie zawiedzie.
Jeśli znasz szczegóły dotyczące danych wejściowych w taki sposób, że wiesz, że trystwierdzenie nigdy nie zawiedzie, jaki jest sens jego posiadania? Unikaj tego, tryjeśli wiesz na pewno, że wszystko zawsze się powiedzie (choć rzadko można mieć całkowitą pewność przez cały okres istnienia kodu).
W każdym razie kompilator niestety nie jest czytnikiem w myślach. Widzi funkcję i jej dane wejściowe, a biorąc pod uwagę posiadane informacje, potrzebuje tego returnoświadczenia na dole, tak jak masz.
Czy jest złą praktyką umieszczanie dodatkowej instrukcji return na końcu tylko po to, aby spełnić składnię i uniknąć błędów kompilacji (z komentarzem wyjaśniającym, że nie zostanie osiągnięty), czy też jest lepszy sposób na zakodowanie czegoś takiego, aby dodatkowe instrukcja zwrotu jest niepotrzebna?
Wręcz przeciwnie, sugerowałbym dobrą praktykę unikanie jakichkolwiek ostrzeżeń kompilatora, np. Nawet jeśli kosztuje to kolejną linię kodu. Nie martw się tutaj zbytnio o liczbę linii. Ustal niezawodność funkcji poprzez testowanie, a następnie przejdź dalej. Po prostu udając, że możesz pominąć returnstwierdzenie, wyobraź sobie, że wracasz do tego kodu rok później, a następnie spróbuj zdecydować, czy to returnstwierdzenie na dole spowoduje więcej zamieszania niż komentarz szczegółowo wyjaśniający, dlaczego zostało pominięte z powodu przypuszczeń, które możesz zrobić o parametrach wejściowych. Najprawdopodobniej returnłatwiej będzie sobie z tym poradzić.
To powiedziawszy, szczególnie w tej części:
try {
return a.clone();
} catch (CloneNotSupportedException e) {
e.printStackTrace();
}
...
return null;
Myślę, że jest coś nieco dziwnego w podejściu do obsługi wyjątków. Zwykle chcesz połknąć wyjątki w witrynie, w której masz coś znaczącego, co możesz zrobić w odpowiedzi.
Możesz myśleć o try/catchmechanizmie transakcji.trydokonanie tych zmian, jeśli zawiodą i rozgałęzimy się do catchbloku, zrób to (cokolwiek jest w catchbloku) w odpowiedzi jako część procesu wycofywania i odzyskiwania.
W tym przypadku samo wydrukowanie śladu stosu, a następnie zmuszenie do zwrócenia wartości null nie jest dokładnie nastawieniem do transakcji / odzyskiwania. Kod przenosi odpowiedzialność za obsługę błędów na wszystkie wywołania kodugetClone celu ręcznego sprawdzenia błędów. Możesz chcieć przechwycić CloneNotSupportedExceptioni przetłumaczyć go na inną, bardziej znaczącą formę wyjątku i wyrzucić go, ale nie chcesz po prostu połykać wyjątku i zwracać null w tym przypadku, ponieważ nie jest to witryna odzyskiwania transakcji.
Skończysz z wyciekiem obowiązków na dzwoniących, aby ręcznie sprawdzić i poradzić sobie z awarią w ten sposób, gdy rzucenie wyjątku pozwoliłoby tego uniknąć.
To tak, jakbyś załadował plik, to transakcja wysokiego poziomu. Możesz try/catchtam mieć . Podczas tryingładowania pliku można klonować obiekty. Jeśli wystąpi awaria w dowolnym miejscu tej operacji wysokiego poziomu (ładowania pliku), zazwyczaj chcesz zgłosić wyjątki z powrotem do tego try/catchbloku transakcji najwyższego poziomu , aby można było bezpiecznie odzyskać sprawność po niepowodzeniu ładowania pliku (niezależnie od tego, czy jest to z powodu błędu w klonowaniu lub czegokolwiek innego). Dlatego generalnie nie chcemy po prostu wchłaniać wyjątku w takim szczegółowym miejscu, jak to, a następnie zwracać wartość null, np. Ponieważ podważyłoby to wiele wartości i celu wyjątków. Zamiast tego chcemy propagować wyjątki z powrotem do witryny, w której możemy w znaczący sposób sobie z tym poradzić.
Objectparametr. Jeślianie jest klasą, która obsługujeclonemetodę (lub jest to zdefiniowane wObject?) Lub jeśli wystąpi błąd podczasclonemetody (lub jakikolwiek inny błąd, o którym nie mogę teraz pomyśleć), może zostać wyrzucony wyjątek i osiągniesz instrukcja zwrotu.