微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我想传递不可变的 Java 对象作为引用,是否有 AtomicReferences 或 Array 或 List 的替代方法?

如何解决我想传递不可变的 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.namex.getName()。)这就是您找不到的原因!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。