Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我想将不可变的Java对象作为引用传递,是否有原子引用、数组或列表的替代方法?_Java_Spring_Apache Commons - Fatal编程技术网

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

我想将不可变的Java对象作为引用传递,是否有原子引用、数组或列表的替代方法?,java,spring,apache-commons,Java,Spring,Apache Commons,假设我想要一个修改2个字符串(或任何其他不可变类)的方法,我不能返回单个对象。因此,我可以传递一个列表、字符串[]或2个原子引用对象。这些都有缺点。列表和数组不允许命名每个参数,我们依靠元素的顺序来确保设置正确的字符串。AtomicReference是用于原子更新的,所以它比我需要它做的更多。我只需要这样的东西: public class Reference <T> { private T value; public T get() { return

假设我想要一个修改2个字符串(或任何其他不可变类)的方法,我不能返回单个对象。因此,我可以传递一个列表、字符串[]或2个原子引用对象。这些都有缺点。列表和数组不允许命名每个参数,我们依靠元素的顺序来确保设置正确的字符串。AtomicReference是用于原子更新的,所以它比我需要它做的更多。我只需要这样的东西:

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;
    }
    
    这些字段可以声明为
    final
    ,然后您需要 声明一个构造函数

    虽然有getter、setter和构造函数是一种很好的风格,但Java语言并不强迫您进行声明和/或使用它们。您只需要理解忽略封装的后果。(并且能够处理负面的代码审查…)


无论如何,都不能设计一个库类,其中字段的名称是常规参数或类型参数。(或者至少不能以常规Java代码可以使用的方式;例如,使用
x.name
x.getName()
)这就是为什么你找不到一个!

要求提供库、API……在这里是离题的。