假设我想要一个方法修改两个字符串(或任何其他不可变的类),我不能返回一个对象。所以我可以传递一个list,string[]或2个atomicreference对象。这些都有缺点。列表和数组不允许命名每个参数,我们依赖于元素的顺序来确保设置了正确的字符串。atomicreference的目的是原子更新,所以它比我需要它做的更多。我只需要这样的东西:
public class Reference <T> {
private T value;
public T get() {
return value;
}
public void set(T value) {
this.value = value;
}
}
我认为在某些apache库或spring库中可以使用这样的类,但是我找不到这样的类。我认为这是许多开发人员的基本需求,那么它是否存在于我不知道的第三方库中呢?
这主要适用于2或3个对象的情况。当有>3个不可变对象时,我可能会创建一个新类来保存这些引用。
我也知道apachepair和triple,但是它们和list有相同的问题,我不能命名参数。
1条答案
按热度按时间vmdwslir1#
如果您希望“命名元组”是不可变的,那么最适合您的需求的是Java14+
record
班级。本质上,它是一个轻量级类,大致类似于c/c++struct
.... 但不变;当您需要“命名元组”是可变的(或者如果java 14+还不适合您),有两种选择:
如果“字段”名称是动态的,那么可以使用
Map
. 任何Map
实施就行了。这方面存在问题:你必须使用
m.get(name)
以及m.put(name, value)
语法。编译器无法检查您是否使用了正确的
name
串。所有值都必须是相同的类型,或者具有相同的基类型。如果“字段”有不同的类型,则需要使用类型转换;e、 g.从
Object
到预期的类型。如果“字段”名称是静态的(即,您希望能够将它们称为java标识符),那么唯一的选择就是声明一个常规类。它可以是一个“未封装”的类;例如
字段可以声明为
final
然后需要声明一个构造函数。虽然有getter、setter和构造函数是一种很好的风格,但是java语言并不强迫您声明和/或使用它们。您只需要了解忽略封装的后果(能够应付负面的代码审查……)
无论如何,您不能设计一个库类,其中字段的名称是常规参数或类型参数(或者至少,不是以传统java代码可以使用的方式;e、 g.使用
x.name
或者x.getName()
)所以你找不到!