是否有一个Java;“参考对象”;存在?

是否有一个Java;“参考对象”;存在?,java,object,reference,Java,Object,Reference,有时,我希望将一个不可变对象传递给一个方法并在该方法内部更改其值,或者我希望将另一个对象分配给参数引用(示例1)。或者,我想在匿名内部类内部为最终的局部变量分配另一个对象(示例2)。因为所有这些情况都不可能实现,所以有时我会使用原子(Integer | Long…)类或列表(这非常糟糕,因为列表可以包含多个对象)来实现这一目的。或者,我可以创建一个类来保存对象并允许更改对象: public class ReferenceExample { public static void main

有时,我希望将一个不可变对象传递给一个方法并在该方法内部更改其值,或者我希望将另一个对象分配给参数引用(示例1)。或者,我想在匿名内部类内部为最终的局部变量分配另一个对象(示例2)。因为所有这些情况都不可能实现,所以有时我会使用原子(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;
        }
    }

}
公共类引用示例{
公共静态void main(字符串[]args){
最终参考字符串=新参考(“a”);
//例1:
方法(字符串);
//例2:
新线程(){
@凌驾
公开募捐{
字符串集(“c”);
};
}.start();
}
公共静态无效方法(引用字符串){
字符串集(“b”);
}
私有静态类引用{
私人T值;
公共引用(){}
公共参考(T值){
这个值=值;
}
公共部门得不到{
返回值;
}
公共无效集(T值){
这个值=值;
}
}
}

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

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

共同解决办法:

  • 让调用者进行分配:

    myVal=anObject.aMethod(myVal)

  • 提供封闭对象

    anObject.aMethod(这个)

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

    anObject.aMethod(新MySetter(){ 公共无效集(int newval){ myVal=newval; }; });


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

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

  • AtomicReference
    ,看起来您已经找到了它
  • 单个元素数组,或多或少充当可变引用
也就是说,您通常可以找到满足需求的方法:

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