我想把不可变的java对象作为引用传递,有没有原子引用、数组或列表的替代方法?

7cwmlq89  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(272)

假设我想要一个方法修改两个字符串(或任何其他不可变的类),我不能返回一个对象。所以我可以传递一个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有相同的问题,我不能命名参数。

vmdwslir

vmdwslir1#

如果您希望“命名元组”是不可变的,那么最适合您的需求的是Java14+ record 班级。本质上,它是一个轻量级类,大致类似于c/c++ struct .... 但不变;
当您需要“命名元组”是可变的(或者如果java 14+还不适合您),有两种选择:
如果“字段”名称是动态的,那么可以使用 Map . 任何 Map 实施就行了。这方面存在问题:
你必须使用 m.get(name) 以及 m.put(name, value) 语法。
编译器无法检查您是否使用了正确的 name 串。
所有值都必须是相同的类型,或者具有相同的基类型。如果“字段”有不同的类型,则需要使用类型转换;e、 g.从 Object 到预期的类型。
如果“字段”名称是静态的(即,您希望能够将它们称为java标识符),那么唯一的选择就是声明一个常规类。它可以是一个“未封装”的类;例如

public class Things {
    public Type1 thing1;
    public Type2 thing2;
}

字段可以声明为 final 然后需要声明一个构造函数。
虽然有getter、setter和构造函数是一种很好的风格,但是java语言并不强迫您声明和/或使用它们。您只需要了解忽略封装的后果(能够应付负面的代码审查……)
无论如何,您不能设计一个库类,其中字段的名称是常规参数或类型参数(或者至少,不是以传统java代码可以使用的方式;e、 g.使用 x.name 或者 x.getName() )所以你找不到!

相关问题