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

时间:2015-10-30 14:11:47

标签: 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]);

这似乎有效,我想有很好的表现。但它感觉有点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,这不是一回事。这些是不可变的,唯一的实现是弱/幻像引用。

2 个答案:

答案 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}}。