1

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

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公共项目中)?如果没有,对于这些问题还有其他好的解决方案吗?

4

2 回答 2

2

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

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

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

  • 从您的方法返回(可能不同的)引用
  • 在包含可变引用作为字段的类中实现方法,无论如何这通常更合适
于 2012-06-05T18:43:12.887 回答
0

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

常见解决方案:

  • 让调用者进行分配:

    myVal = anObject.aMethod(myVal);

  • 提供封闭对象

    anObject.aMethod(this);

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

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

确实,java 有时会强迫您进行更多您想要的封装。这似乎是一件好事,或者可能被视为 java 被认为是一种冗长语言的原因之一。

于 2012-06-05T18:34:47.617 回答