Dlaczego w Javie można oznaczać zmienne lokalne i parametry metody jako "ostateczne"? [zamknięte]

W Javie zmienne lokalne i parametry metod można kwalifikować za pomocą końcowego słowa kluczowego.

public static void foo(final int x) {
  final String qwerty = "bar"; 
}

Powoduje to, że nie można przypisać x i qwerty do ciała metody.

Ta praktyka popycha Twój kod w kierunku niezmienności, która jest ogólnie uważana za plus. Ale ma również tendencję do zaśmiecania kodu "ostatecznym" pojawiającym się wszędzie. Jaka jest twoja opinia o ostatecznym słowie kluczowym dla zmiennych lokalnych i parametrów metod w Javie?

 57
Author: ordnungswidrig, 2008-11-25

12 answers

Powinieneś spróbować to zrobić, kiedy tylko jest to właściwe. Oprócz tego, że służy do ostrzegania, gdy "przypadkowo" próbujesz zmodyfikować wartość, dostarcza kompilatorowi informacje, które mogą prowadzić do lepszej optymalizacji pliku klasy. Jest to jeden z punktów w książce "Hardcore Java" Roberta Simmonsa, Jr. w rzeczywistości książka poświęca cały drugi rozdział na wykorzystanie final do promowania optymalizacji i zapobiegania błędom logicznym. Narzędzia do analizy statycznej, takie jak PMD i wbudowany SA Eclipse Oznacz tego rodzaju przypadki z tego powodu.

 53
Author: rjray,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-25 09:15:10

Moja osobista opinia jest taka, że to strata czasu. Uważam, że bałagan wizualny i dodana zwięzłość nie jest tego warta.

Nigdy nie byłem w sytuacji, w której ponownie przypisałem (pamiętaj, że to nie czyni obiektów niezmiennymi, wszystko to znaczy, że nie można przypisać innego odniesienia do zmiennej) zmienną w błędzie.

Ale oczywiście to wszystko osobiste preferencje; -)

 27
Author: SCdF,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-25 04:22:47

Nadanie parametru finalnego gwarantuje, że wartość użyta w dowolnym miejscu w metodzie odnosi się do przekazanej wartości. W przeciwnym razie musisz umysłowo przeanalizować cały kod nad daną lokalizacją, aby wiedzieć, jaką wartość ma parametr w tym momencie.

Stąd nie używanie final sprawia, że Twój kod jest mniej czytelny i łatwy do utrzymania:)

Ostateczne zmienne lokalne zależą od intencji i są mniej ważne z mojego punktu widzenia. Zależy, co się dzieje.

 8
Author: Thorbjørn Ravn Andersen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-08-30 08:24:06

W przypadku zmiennych lokalnych Zwykle tego unikam. Powoduje to bałagan wizualny i ogólnie jest niepotrzebny - funkcja powinna być wystarczająco krótka lub skupić się na pojedynczym wpływie, aby szybko zobaczyć, że modyfikujesz coś, co nie powinno być.

W przypadku liczb magicznych i tak umieściłbym je jako stałe pole prywatne, a nie w kodzie.

Używam final tylko w sytuacjach, w których jest to konieczne (np. przekazywanie wartości do klas anonimowych).

 6
Author: Uri,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-25 04:35:26

Ze względu na (czasami) mylącą naturę zachowania Javy "pass by reference " zdecydowanie zgadzam się z finalizacją parametru var.

Finalizacja lokalnych var wydaje się IMO nieco przesadna.

 5
Author: javamonkey79,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:11

Tak, zrób to.

Chodzi o czytelność. Łatwiej jest rozumować o możliwych Stanach programu, gdy wiesz, że zmienne są przypisane raz i tylko raz.

Przyzwoitą alternatywą jest włączenie Ostrzeżenia IDE, gdy parametr jest przypisany, lub gdy zmienna (inna niż zmienna pętli) jest przypisana więcej niż jeden raz.

 3
Author: Craig P. Motlin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-05 17:29:16

Finał ma trzy dobre powody:

  • zmienne instancji ustawione przez konstruktor stają się niezmienne
  • metody, które nie mają być nadpisane, stają się ostateczne, użyj tego z prawdziwymi powodami, a nie domyślnie
  • zmienne lokalne lub parametry, które mają być użyte w anonimowych klasach wewnątrz metody muszą być ostateczne

Podobnie jak metody, zmienne lokalne i parametry nie muszą być deklarowane jako ostateczne. Jak już wcześniej mówili inni, powoduje to, że kod staje się mniej czytelny przy bardzo małym efford dla optymalizacji wydajności kompilatora, nie jest to prawdziwy powód dla większości fragmentów kodu.

 2
Author: Arne Burmeister,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-03 23:00:40

Chociaż tworzy trochę bałaganu, warto umieścić final. Ides np. eclipse może automatycznie wstawić final jeśli skonfigurujesz go do tego.

 2
Author: fastcodejava,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-03 23:59:54

Tworzenie lokalnych zmiennych i parametrów metody final jest niezbędne, jeśli chcesz przekazać te parametry do anonimowych klas - jak tworzysz instancję anonimowego wątku i chcesz uzyskać dostęp do tych param w ciele metody run ().

Poza tym nie jestem pewien korzyści wydajności w. R. T lepsza wydajność poprzez optymalizację kompilatora. Od konkretnej implementacji kompilatora zależy, czy w ogóle chce ją zoptymalizować...

Dobrze będzie wiedzieć o każdym statystyki wydajności z użycia final...

 2
Author: kartheek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-04 00:12:38

Dlaczego miałbyś chcieć? Napisałeś metodę, więc każdy, kto ją zmodyfikuje, zawsze może usunąć ostatnie słowo kluczowe z qwerty i przypisać je ponownie. Co do podpisu metody, to samo rozumowanie, chociaż nie jestem pewien, co by to zrobiło z podklasami twojej klasy... mogą one dziedziczyć ostateczny parametr i nawet jeśli nadpisują metodę, nie będą w stanie zakończyć X. spróbuj i dowiedz się, czy to zadziała.

Jedyną realną korzyścią jest to, że parametr jest niezmienny i przenosi się za dzieci. W przeciwnym razie po prostu zaśmiecasz swój kod bez szczególnie dobrego powodu. Jeśli to nie zmusi nikogo do przestrzegania Twoich zasad, lepiej zostaw dobry komentarz, ponieważ dlaczego nie powinieneś zmieniać tego parametru lub zmiennej zamiast podawać jeśli ostateczny modyfikator.

Edit

W odpowiedzi na komentarz, dodam, że jeśli widzisz problemy z wydajnością, dzięki temu, że Twoje lokalne zmienne i parametry są ostateczne, kompilator może zoptymalizować twój kod lepiej. Jednak z punktu widzenia niezmienności Pańskiego kodu, podtrzymuję moje pierwotne stwierdzenie.

 0
Author: Elie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-25 04:29:27

Pozwoliłem Eclipse zrobić to za mnie, gdy są one używane w anonimowej klasie, która rośnie ze względu na moje użycie Google Collection API.

 0
Author: Miserable Variable,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-25 05:54:35

Robimy to tutaj dla zmiennych lokalnych, jeśli uważamy, że nie zostaną ponownie przypisane lub nie powinny być ponownie przypisane.

Parametry NIE są ostateczne, ponieważ mamy Checkstyle-Check, który sprawdza zmiany parametrów. Oczywiście nikt nigdy nie chciałby ponownie przypisać zmiennej parametru.

 0
Author: boutta,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-11-25 07:10:13