java - 我想将不可变的 Java 对象作为引用传递,是否有 AtomicReferences 或 Array 或 List 的替代方法?
问题描述
假设我想要一个修改 2 个字符串(或任何其他不可变类)的方法,我不能返回单个对象。所以我可以传递一个 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 库中可用,但我找不到这样的东西。我认为这对许多开发人员来说是一个非常基本的需求,那么它是否在我不知道的某个 3rd 方库中?
这主要适用于 2 或 3 个对象的情况。当有 >3 个不可变对象时,我可能会创建一个新类来保存这些引用。
我也知道 Apache Pair 和 Triple,但它们与 List 有相同的问题,我无法命名参数。
解决方案
如果您希望“命名元组”不可变,最适合您要求的是 Java 14+record
类。本质上,它是一个轻量级的类,大致类似于 C / C++ struct
.... 但不可变;
当您需要“命名元组”是可变的(或者如果 Java 14+ 还不是您的选择),有两种选择:
如果“字段”名称是动态的,那么您可以使用
Map
. 任何Map
实现都可以。这样做有问题:- 您必须使用
m.get(name)
和m.put(name, value)
语法。 - 编译器无法检查您是否使用了正确的
name
字符串。 - 这些值都必须是相同的类型,或者具有相同的基本类型。如果“字段”有不同的类型,则需要使用类型转换;例如从
Object
到预期的类型。
- 您必须使用
如果“字段”名称是静态的(即您希望能够将它们称为 Java 标识符,则唯一的选择是声明一个常规类。它可能是一个“未封装”类;例如
public class Things { public Type1 thing1; public Type2 thing2; }
这些字段可以声明为
final
,然后您需要声明一个构造函数。虽然拥有 getter、setter 和构造函数是一种很好的风格,但 Java 语言并不强制您声明和/或使用它们。您只需要了解忽略封装的后果。(并且能够应对负面的代码审查......)
对于它的价值,您不能设计一个库类,其中您的字段名称是常规参数或类型参数。(或者至少,不是以传统 Java 代码可以使用x.name
的方式;例如使用or x.getName()
。)这就是为什么你找不到一个!
推荐阅读
- c++ - std::accumulate C++20 版本
- unity3d - 在 Hololens 上部署的 Unity UWP 应用中使用 StorageFolder 的问题
- c++ - 测量在 C++ 中的 while 循环中运行的函数的执行时间(Windows)
- python - 无法将大小为 1665179 的数组重塑为形状 (512,512,3,3)
- html - 将图像文件夹添加到公共域 a2 托管
- excel - 我的 VBA 代码的“elseif”部分有效,但“if”无效
- bootstrap-4 - 使用循环和哈巴狗引导轮播
- python - 如何将matplotlib的日期时间索引转换为月份
- php - 如何使用 Symfony 5.1 安装 Mongodb-odm-bundle?
- python-3.x - ValueError:使用火炬张量时解包的值太多