使用 Varargs,我可以根据变量名称为变量赋值吗?

Using Varargs, can I assign values to variables based on the variable name?

我正在尝试将可变数量的参数传递给构造函数,因为并非所有值都是必需的,空值也可以。我可以这样做,以便我可以按任何顺序传递变量,并将它们正确分配给 class 中的相应变量吗?

在我的案例中需要注意的几件事是 class 中的变量是序列化的;这些值可以是字符串、整数、布尔值或日期;并且传递给构造函数的值将始终匹配其相应的 class 值(如果 class 中的值是一个整数,则该值将始终传递一个整数,而不是 String.parseInt(), 例如)

Class Foo {
  @SerializedName("id")
  private Integer id;

  @SerializeName("name")
  private String name;

  @SerializedName("isFoo")
  private Date isFoo;

  public Foo (Object... args){
  }
}

在构造函数中,我希望能够询问任何对象名称是否与 class 中的变量匹配,以便将其分配给该变量。那么,如果传递的对象之一是一个名为 id 的整数,是否有办法将其与 id 匹配?少数情况下应该可以匹配到:

Foo foo = new Foo(id, name) //In this case, the bool would be null
Foo foo2 = new Foo(name, id, isFoo) //Here the Integer is second, but should still be able to be passed in correctly

我认为这可以通过反射来解决,但我不确定如何解决。任何帮助都会很棒。

我在下面回答您的实际问题,但回答问题的潜在需求时,您可能正在寻找 Builder 模式:

Foo foo = new Foo.Builder().id(id).name(name).build();
Foo foo = new Foo.Builder().name(name).id(id).isFoo(isFoo).build();

它是原始的四人组模式之一。

(在上面我在 Foo 中做了 Builder 一个嵌套的 class,因为构建器 class 和它构建的东西往往是密切相关的。但是这不是必需的,这只是完成的一种方式。)


...can I assign values to variables based on the variable name?

没有。 变量 未传递给您的方法。从变量中读取包含的 value,然后 that value 传递给您的方法。当它到达您的方法时,与值来自的变量没有任何联系(如果实际上它来自变量)。

在您的具体示例中,由于它们每个都有不同的类型,您可以可以检查args中的每个条目以查看其类型并起作用从那开始,但这会很奇怪,我不推荐它。

强调我不推荐它,它看起来像:

for (Object arg : args) {
    if (arg instanceof Integer) {
        this.id = (Integer)arg;
    } else if (arg instanceof String) {
        this.name = (String)arg;
    } else if (arg instanceof Date) {
        this.isFoo = (Date)arg;
    }
}

但是,我不会再次推荐它,如果我在代码审查中遇到它,我会想要一个 非常非常好的理由。 :-)