Возьмите следующий пример:
public void init() {
final Environment env = new Environment();
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
env.close();
}
});
}
Во-первых, где env
сохраненный? Это:
Мое предположение является первой опцией.
Во-вторых, сделайте любые проблемы производительности, которые являются результатом выполнения этого (вместо простого создания env
как членская переменная класса и ссылки на него как таковой) особенно, если Вы создаете большие количества таких внутренних конструкций класса та ссылка заключительные локальные переменные.
Да, они скопированы, поэтому переменную нужно объявить окончательной. Таким образом, они гарантированно не изменятся после того, как будет сделана копия.
Это разные, например, поля, которые доступны, даже если они не являются окончательными. В этом случае внутренний класс получает ссылку на внешний экземпляр, который он использует для этой цели.
private Environment env; // a field does not have to be final
public void init() {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
env.close();
}
});
}
Во-вторых, возникают ли при этом какие-либо проблемы с производительностью?
По сравнению с чем? Для того чтобы ваш внутренний класс работал, вам нужно иметь вокруг себя поле или переменную, а копия - очень эффективный способ. В любом случае, это всего лишь "мелкая" копия: просто копируется ссылка на (в вашем примере) Окружение, а не на само Окружение.