#java
Давайте представим, что есть некий метод, который принимает скажем 3 параметра. public void something(final String id, final String name, final Entity entity){ //... } В данном случае все параметры помечены как final. Т.е. я точно знаю, что не буду их изменять, а только буду пользоваться их значениями. Какие + и - описанного выше. Стоит ли писать слово 'final' в параметрах метода? Имеет ли это какой-либо смысл в плане оптимизации?
Ответы
Ответ 1
Вот такой класс 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(Ljava/lang/String;Ljava/lang/String;)V L0 LINENUMBER 5 L0 ALOAD 0 INVOKESPECIAL java/lang/Object. ()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 переменной), а в байткоде эти модификаторы будут банально отброшены, так как особого смысла в них уже не будет.
Комментариев нет:
Отправить комментарий