Czy istnieje jakiś powód wydajnościowy, aby deklarować parametry metody jako ostateczne w Javie?
Jak w:
public void foo(int bar) { ... }
Przeciw:
public void foo(final int bar) { ... }
Zakładając, że bar
jest to tylko do odczytu i nigdy nie modyfikowane w foo()
.
java
performance
final
Wyrko
źródło
źródło
Odpowiedzi:
Ostatnie słowo kluczowe nie pojawia się w pliku klasy dla lokalnych zmiennych i parametrów, dlatego nie może wpływać na wydajność środowiska wykonawczego. Służy jedynie do wyjaśnienia zamiaru programistów, aby zmienna nie była zmieniana (co wielu uważa za wątpliwy powód jej użycia) i radzenia sobie z anonimowymi klasami wewnętrznymi.
Istnieje wiele argumentów na temat tego, czy ostateczny modyfikator samej metody ma jakikolwiek wzrost wydajności, ponieważ metody i tak zostaną wbudowane przez optymalizujący kompilator w czasie wykonywania, niezależnie od modyfikatora. W tym przypadku należy go również używać tylko do ograniczenia nadpisywania metody.
źródło
Jedyną zaletą końcowego parametru jest to, że można go używać w anonimowych klasach zagnieżdżonych. Jeśli parametr nigdy nie zostanie zmieniony, kompilator już wykryje to w ramach swojej normalnej pracy, nawet bez końcowego modyfikatora. Rzadko zdarza się, że błędy są spowodowane nieoczekiwanym przypisaniem parametru - jeśli twoje metody są wystarczająco duże, aby wymagać tego poziomu inżynierii, zmniejsz je - metody, które wywołujesz, nie mogą zmienić parametrów.
źródło
Kompilatory działające po załadowaniu klasy, takie jak kompilatory JIT, mogą korzystać z metod końcowych. W konsekwencji metody uznane za ostateczne mogą przynieść pewne korzyści w zakresie wydajności.
http://www.javaperformancetuning.com/tips/final.shtml
Aha i kolejny dobry zasób
http://mindprod.com/jgloss/final.html
źródło
Jeszcze tylko jeden punkt wyżej, niż użycie nieostatecznych zmiennych lokalnych zadeklarowanych w metodzie - instancja klasy wewnętrznej może przeżyć ramkę stosu, więc zmienna lokalna może zniknąć, gdy obiekt wewnętrzny wciąż żyje
źródło
Zakładam, że kompilator mógłby ewentualnie usunąć wszystkie prywatne statyczne zmienne końcowe, które mają typ prymitywny, taki jak int, i wstawić je bezpośrednio do kodu, tak jak w przypadku makra C ++.
Nie mam jednak pojęcia, czy robi się to w praktyce, ale można to zrobić, aby zaoszczędzić trochę pamięci.
źródło