采用以下示例:
public void init() {
final Environment env = new Environment();
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
env.close();
}
});
}
首先,env
存储在哪里?是吗:
我的猜测是第一个选择。
其次,执行此操作会产生任何性能问题(而不是简单地将env
创建为类的成员变量并将其作为引用),特别是如果要创建大量此类内部类构造,引用最终局部变量。
答案 0 :(得分:18)
是的,它们被复制,这就是你必须将变量声明为final的原因。这样,保证在复制完成后不会改变它们。
这与实例字段不同,即使不是最终字段也可以访问。在这种情况下,内部类获取对它用于此目的的外部实例的引用。
private Environment env; // a field does not have to be final
public void init() {
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
env.close();
}
});
}
其次,执行此操作会产生任何性能问题吗?
相比什么?你需要为你的内部类提供字段或变量才能工作,副本是一种非常有效的方法。它只是一个“浅”的副本:只复制(在你的例子中)环境的引用,而不是环境本身。