Где локальные переменные финала Java хранятся?

Возьмите следующий пример:

public void init() {
    final Environment env = new Environment();
    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
             env.close();
        }
     });
}

Во-первых, где env сохраненный? Это:

  • скопированный компилятором в скрытую членскую переменную внутреннего класса, который ссылается на него
  • скопированный в, и ссылаемый на, "куча"
  • оставленный на стеке и так или иначе ссылаемый там
  • что-то еще

Мое предположение является первой опцией.

Во-вторых, сделайте любые проблемы производительности, которые являются результатом выполнения этого (вместо простого создания env как членская переменная класса и ссылки на него как таковой) особенно, если Вы создаете большие количества таких внутренних конструкций класса та ссылка заключительные локальные переменные.

19
задан Chip Uni 22 December 2009 в 11:29
поделиться

1 ответ

Да, они скопированы, поэтому переменную нужно объявить окончательной. Таким образом, они гарантированно не изменятся после того, как будет сделана копия.

Это разные, например, поля, которые доступны, даже если они не являются окончательными. В этом случае внутренний класс получает ссылку на внешний экземпляр, который он использует для этой цели.

private Environment env;  // a field does not have to be final

public void init() {
    Runtime.getRuntime().addShutdownHook(new Thread() {
        public void run() {
             env.close();
        }
     });
}

Во-вторых, возникают ли при этом какие-либо проблемы с производительностью?

По сравнению с чем? Для того чтобы ваш внутренний класс работал, вам нужно иметь вокруг себя поле или переменную, а копия - очень эффективный способ. В любом случае, это всего лишь "мелкая" копия: просто копируется ссылка на (в вашем примере) Окружение, а не на само Окружение.

19
ответ дан 30 November 2019 в 04:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: