使用 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;
}
}
但是,我不会再次推荐它,如果我在代码审查中遇到它,我会想要一个 非常非常好的理由。 :-)
我正在尝试将可变数量的参数传递给构造函数,因为并非所有值都是必需的,空值也可以。我可以这样做,以便我可以按任何顺序传递变量,并将它们正确分配给 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;
}
}
但是,我不会再次推荐它,如果我在代码审查中遇到它,我会想要一个 非常非常好的理由。 :-)