Java "reference object"存在吗?



有时我想将一个不可变的对象传递给方法并在方法中更改其值,或者我想将另一个对象分配给参数引用(示例 1)。或者我想在匿名内部类内部将另一个对象分配给最终的局部变量(示例 2)。因为所有这些情况都是不可能的,所以有时我使用 Atomic(Integer|长...类或列表(这真的很糟糕,因为列表可以包含多个对象)用于此目的。或者,我可以创建一个包含对象并允许更改对象的类:

public class ReferenceExample {
    public static void main(String[] args) {
        final Reference<String> string = new Reference<>("a");
        // Example 1:
        method(string);
        // Example 2:
        new Thread() {
            @Override
            public void run() {
                string.set("c");
            };
        }.start();
    }
    public static void method(Reference<String> string) {
        string.set("b");
    }
    private static class Reference<T> {
        private T value;
        public Reference() {}
        public Reference(T value) {
            this.value = value;
        }
        public T get() {
            return value;
        }
        public void set(T value) {
            this.value = value;
        }
    }
}

我想知道这样的类是否已经存在于 Java 或公共库中(例如在 apache 公共项目中)?如果没有,这些问题还有其他好的解决方案吗?

您已经找到了主要解决方案,但其他两种常见方法是

  • AtomicReference ,看起来你已经找到了
  • 单元素数组,或多或少充当可变引用

也就是说,您通常可以找到解决需求的方法:

  • 从您的方法返回(可能不同的)引用
  • 在包含可变引用作为字段的类中实现该方法,无论如何,这通常更合适

在纯 java 中没有通用且常用的解决方案。使用一个而不是使用 java 特定的解决方案可能是不好的做法。

常见的解决方案:

  • 让调用方进行分配:

    myVal = anObject.aMethod(myVal);

  • 提供封闭对象

    anObject.aMethod(this);

  • 提供一个回调
  • ,该回调将为变量分配一个新值。为此,您通常必须定义一个回调实现的接口:

    anObject.aMethod(new MySetter(){ public void set(int newval) { myVal = newval; }; });

Java迫使你有时进行更多的封装,这是完全正确的。这似乎是一件好事,或者可能被视为Java被认为是一种冗长语言的原因之一。

最新更新