Давайте представим, что есть некий метод, который принимает скажем 3 параметра.
public void something(final String id, final String name, final Entity entity){
//...
}
В данном случае все параметры помечены как final. Т.е. я точно знаю, что не буду их изменять, а только буду пользоваться их значениями. Какие + и - описанного выше. Стоит ли писать слово 'final' в параметрах метода? Имеет ли это какой-либо смысл в плане оптимизации?
Вот такой класс
public class Final {
private final String second;
private String first;
public Final(String first, final String second) {
this.first = first;
this.second = second;
}
}
Компилируется в вот такой байткод
// class version 52.0 (52)
// access flags 0x21
public class Final {
// compiled from: Final.java
// access flags 0x12
private final Ljava/lang/String; second
// access flags 0x2
private Ljava/lang/String; first
// access flags 0x1
public <init>(Ljava/lang/String;Ljava/lang/String;)V
L0
LINENUMBER 5 L0
ALOAD 0
INVOKESPECIAL java/lang/Object.<init> ()V
L1
LINENUMBER 6 L1
ALOAD 0
ALOAD 1
PUTFIELD Final.first : Ljava/lang/String;
L2
LINENUMBER 7 L2
ALOAD 0
ALOAD 2
PUTFIELD Final.second : Ljava/lang/String;
L3
LINENUMBER 8 L3
RETURN
L4
LOCALVARIABLE this LFinal; L0 L4 0
LOCALVARIABLE first Ljava/lang/String; L0 L4 1
LOCALVARIABLE second Ljava/lang/String; L0 L4 2
MAXSTACK = 2
MAXLOCALS = 3
}
Как видно, в сгенерированном байткоде, у final String second исчез модификатор final - Ljava/lang/String;
Т.е. в случае использования final как параметра метода или конструктора, ограничения накладываются только на этап компиляции (т.е. компилятор выдаст ошибку, если вы будете изменять значение final переменной), а в байткоде эти модификаторы будут банально отброшены, так как особого смысла в них уже не будет.
Сборка персонального компьютера от Artline: умный выбор для современных пользователей