是否有比单元素数组更好的引用容器?

sli*_*lim 7 java

如果该变量是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- 但作为一个简单的包装器对象,我认为这是一个很好的解决方案.


ass*_*ias 5

我认为对于这种特定类型的情况,您的方法很常见。

还有AtomicReference,尽管它通常用于多线程上下文中。

或者您可以使用Callable<String>返回的"Hello World"a 而不是Runnable