如果该变量是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]);
Run Code Online (Sandbox Code Playgroud)
这似乎有效,我想有很好的表现.但它感觉有点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());
Run Code Online (Sandbox Code Playgroud)
...标准Java运行时中是否有现有的类来执行此操作?
我看过了java.lang.ref.Reference,这不是一回事.这些是不可变的,唯一的实现是弱/幻像引用.
Jon*_*eet 14
还有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());
Run Code Online (Sandbox Code Playgroud)
这里唯一的缺点是,除非涉及多个线程,否则它通常是为并发访问设计的一点误导AtomicReference- 但作为一个简单的包装器对象,我认为这是一个很好的解决方案.
我认为对于这种特定类型的情况,您的方法很常见。
还有AtomicReference,尽管它通常用于多线程上下文中。
或者您可以使用Callable<String>返回的"Hello World"a 而不是Runnable。