Объявление параметров метода как final

175
18 декабря 2017, 13:52

Давайте представим, что есть некий метод, который принимает скажем 3 параметра.

public void something(final String id, final String name, final Entity entity){
    //...
}

В данном случае все параметры помечены как final. Т.е. я точно знаю, что не буду их изменять, а только буду пользоваться их значениями. Какие + и - описанного выше. Стоит ли писать слово 'final' в параметрах метода? Имеет ли это какой-либо смысл в плане оптимизации?

Answer 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 <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 переменной), а в байткоде эти модификаторы будут банально отброшены, так как особого смысла в них уже не будет.

READ ALSO
Структура проекта для Maven

Структура проекта для Maven

Чтобы упростить понимание моего вопроса, я максимально упрощу ситуациюУ меня есть проекы Hotel и Configurator

239
Проблема с процессорами Mediatek. Please Help Me!

Проблема с процессорами Mediatek. Please Help Me!

Разработал приложение на Android Studio 23

208
Сжатие битмап Андроид Ява

Сжатие битмап Андроид Ява

Всем приветВ приложения при нажатии на кнопу выбираем изоброжения из галереи

126
Player на Java FX

Player на Java FX

Добрый день! Появилась задача написать player который будет проигрывать потоковое видео с определенных сайтов, например youtube

244