我想将不可变的Java对象作为引用传递,是否有原子引用、数组或列表的替代方法?
假设我想要一个修改2个字符串(或任何其他不可变类)的方法,我不能返回单个对象。因此,我可以传递一个列表、字符串[]或2个原子引用对象。这些都有缺点。列表和数组不允许命名每个参数,我们依靠元素的顺序来确保设置正确的字符串。AtomicReference是用于原子更新的,所以它比我需要它做的更多。我只需要这样的东西:我想将不可变的Java对象作为引用传递,是否有原子引用、数组或列表的替代方法?,java,spring,apache-commons,Java,Spring,Apache Commons,假设我想要一个修改2个字符串(或任何其他不可变类)的方法,我不能返回单个对象。因此,我可以传递一个列表、字符串[]或2个原子引用对象。这些都有缺点。列表和数组不允许命名每个参数,我们依靠元素的顺序来确保设置正确的字符串。AtomicReference是用于原子更新的,所以它比我需要它做的更多。我只需要这样的东西: public class Reference <T> { private T value; public T get() { return
public class Reference <T> {
private T value;
public T get() {
return value;
}
public void set(T value) {
this.value = value;
}
}
公共类参考{
私人T值;
公共部门得不到{
返回值;
}
公共无效集(T值){
这个值=值;
}
}
我认为在某些Apache库或Spring库中可以使用类似的类,但我找不到类似的类。我认为这是许多开发人员的基本需求,所以我不知道它是否存在于某些第三方库中
这主要适用于2或3个对象的情况。当有>3个不可变对象时,我可能会创建一个新类来保存这些引用
我也知道Apache Pair和Triple,但它们与List有相同的问题,我无法命名参数。如果您希望“命名元组”是不可变的,最适合您的需求是Java 14+记录
类。本质上,它是一个轻量级类,大致类似于C++/C++ <代码>结构>代码>…但一成不变
当您需要“命名元组”是可变的(或者如果Java 14+还不适合您),有两种选择:
- 如果“字段”名称是动态的,则可以使用
。任何映射
实现都可以。这方面存在问题:Map
- 必须使用
和m.get(name)
语法m.put(name,value)
- 编译器无法检查您是否使用了正确的
字符串名称
- 所有值都必须是相同的类型,或具有相同的基类型。如果“字段”有不同的类型,则需要使用类型转换;e、 g.从
到预期类型对象
- 必须使用
- 如果“字段”名称是静态的(即,您希望能够将它们称为Java标识符),唯一的替代方法是声明一个常规类
这些字段可以声明为public class Things { public Type1 thing1; public Type2 thing2; }
,然后您需要 声明一个构造函数 虽然有getter、setter和构造函数是一种很好的风格,但Java语言并不强迫您进行声明和/或使用它们。您只需要理解忽略封装的后果。(并且能够处理负面的代码审查…)final
无论如何,都不能设计一个库类,其中字段的名称是常规参数或类型参数。(或者至少不能以常规Java代码可以使用的方式;例如,使用
x.name
或x.getName()
)这就是为什么你找不到一个!要求提供库、API……在这里是离题的。