Czy ostatnia zmienna może zostać ponownie przypisana do połowu, nawet jeśli przypisanie jest ostatnią operacją w próbie?
Jestem tutaj całkiem przekonany
final int i;
try { i = calculateIndex(); }
catch (Exception e) { i = 1; }
i
nie może być już przypisany, jeśli sterowanie osiągnie blok-catch. Jednak kompilator Java nie zgadza się i twierdzithe final local variable i may already have been assigned
.
Czy nadal brakuje mi subtelności, czy też jest to słabość modelu używanego przez specyfikację języka Java do identyfikacji potencjalnych zmian przypisania? Moim głównym zmartwieniem są takie rzeczyThread.stop()
, co może skutkować wyrzuceniem wyjątku „z powietrza”, ale nadal nie widzę, jak można go rzucić po przydzieleniu, co jest najwyraźniej ostatnią akcją w bloku prób.
Powyższy idiom, jeśli jest dozwolony, ułatwiłby wiele z moich metod. Zauważ, że ten przypadek użycia ma pierwszorzędną obsługę w językach, takich jak Scala, które konsekwentnie używająMoże monad:
final int i = calculateIndex().getOrElse(1);
Myślę, że ten przypadek użycia służy jako całkiem dobra motywacja, aby pozwolić na jeden specjalny przypadeki
jestzdecydowanie nieprzypisany w bloku catch.
Po pewnym przekonaniu jestem nawet bardziej pewny, że to tylko słabość modelu JLS: jeśli zadeklaruję aksjomat w przedstawionym przykładzie,i
jest zdecydowanie nieprzypisane, gdy kontrola osiągnie blok catch ”, nie będzie kolidować z żadnym innym aksjomatem lub twierdzeniem. Kompilator nie pozwoli na odczyti
zanim zostanie on przypisany w bloku catch, więc fakt, czyi
został przypisany lub nie może być nieobserwowany.