我试图将一个可变数量的参数传递给构造函数,因为并不是所有的值都是必需的,并且空值是可以的。我可以这样做,以便我可以按任何顺序传递变量,并让它们正确地分配给类中相应的变量吗?
在我的案例中,很少有注意事项是类中的变量是序列化的;值可以是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解决,但我不确定如何。任何帮助都会很棒。
答案 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;
}
}
但同样,我不推荐它,如果我在代码审查中遇到它,我想要一个非常,非常好的理由。 : - )