是否存在Java“引用对象”?

时间:2012-06-05 18:29:57

标签: java object reference

有时我想将一个不可变对象传递给一个方法并在方法内部更改它的值,或者我想将另一个对象分配给参数引用(例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公共项目中)?如果没有,这些问题还有其他好的解决方案吗?

2 个答案:

答案 0 :(得分:2)

您已找到主要解决方案,但另外两种常见方法是

  • AtomicReference,看起来你已经找到了
  • 单元素数组,或多或少地作为可变参考

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

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

答案 1 :(得分:0)

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

常见解决方案:

  • 让来电者进行分配:

    myVal = anObject.aMethod(myVal);

  • 提供封闭对象

    anObject.aMethod(this);

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

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

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