有时我想将一个不可变的对象传递给方法并在方法中更改其值,或者我想将另一个对象分配给参数引用(示例 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被认为是一种冗长语言的原因之一。