如果该变量为final
,Java匿名类只能访问周围方法中的变量,因此内部类无法写入该变量。为了捕获由封闭类型创建的对象,我创建了一个final
单元素数组作为参考:
final String[] ref = new String[1];
final Runnable runnable = new Runnable() {
public void run() {
ref[0] = "Hello world";
}
};
runnable.run();
System.out.println(ref[0]);
这似乎有效,我想有很好的表现。但它感觉有点hacky。
显然,编写一个Ref
类来替换它是非常简单的:
final Ref<String> ref = new Ref<>();
final Runnable runnable = new Runnable() {
public void run() {
ref.set("Hello world");
}
};
runnable.run();
System.out.println(ref.get());
...标准Java运行时中是否有现有的类来执行此操作?
我看过java.lang.ref.Reference
,这不是一回事。这些是不可变的,唯一的实现是弱/幻像引用。
答案 0 :(得分:11)
这是我通常使用的AtomicReference<T>
。
final AtomicReference<String> ref = new AtomicReference<String>();
final Runnable runnable = new Runnable() {
public void run() {
ref.set("Hello world");
}
};
runnable.run();
System.out.println(ref.get());
这里唯一的缺点是,除非涉及多个线程,否则稍微误导,因为AtomicReference
通常是为并发访问而设计的 - 但作为一个简单的包装器对象,我认为这是一个不错的选择溶液
答案 1 :(得分:2)
我认为对于那种特定类型的情况,你的方法很常见。
虽然它通常用于多线程上下文,但也有AtomicReference。
或者您可以使用返回Callable<String>
而不是"Hello World"
的{{1}}。