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

时间:2016-03-03 17:19:42

标签: java serialization reflection variadic-functions

我试图将一个可变数量的参数传递给构造函数,因为并不是所有的值都是必需的,并且空值是可以的。我可以这样做,以便我可以按任何顺序传递变量,并让它们正确地分配给类中相应的变量吗?

在我的案例中,很少有注意事项是类中的变量是序列化的;值可以是String,Integer,boolean或Date;并且传递给构造函数的值将始终与其对应的类值匹配(如果类中的值是Integer,则始终为该值传入Integer,而不是String.parseInt(),例如)

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

  @SerializeName("name")
  private String name;

  @SerializedName("isFoo")
  private Date isFoo;

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

在构造函数中,我希望能够询问对象名称是否与类中的变量匹配,以将其分配给该变量。因此,如果传递的一个Object是一个名为id的Integer,有没有办法将它与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

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

1 个答案:

答案 0 :(得分:3)

我在下面回答你的实际问题,但回答问题的潜在愿望,你可能正在寻找Builder模式:

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

这是最初的Gang of Four模式之一。

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

  

...我可以根据变量名称为变量赋值吗?

没有。 变量不会传递给您的方法。从中读取变量中包含的,并将传递给您的方法。当它到达你的方法时,没有任何连接回到值来自的变量(事实上,它来自变量)。

在您的具体示例中,由于它们中的每一个都具有不同的类型,因此可以检查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;
    }
}

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