2016-03-03 97 views
1

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

在我的情况下,很少有值得注意的是类中的变量是序列化的;值可以是字符串,整数,布尔值或日期;并且传递给构造函数的值将始终与其相应的类值匹配(如果类中的值是整数,则将始终传入整数以获取该值,而不是String.parseInt(),例如)

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

    @SerializeName("name") 
    private String name; 

    @SerializedName("isFoo") 
    private Date isFoo; 

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

在构造函数中,我希望能够询问任何对象名称是否与类中的某个变量相匹配,以便将其分配给该变量。所以如果一个Object的传递是一个Integer命名的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 

我认为这可以通过反射来解决,但我不知道如何。任何帮助将是惊人的。

+2

对象没有名称。只有变量有名字。调用者使用的变量名称对于被调用者而言是未知的(并且不相关)。所有你收到的是一个对象数组。将三个参数传递给您的构造函数,如果您希望其中一个参数为null,则传递null参数。 –

+0

我认为你的目标是避免混乱的构造函数重载。我建议你将整个设计更改为[流利的构建器](https://en.wikipedia.org/wiki/Fluent_interface#Java)。 – Mena

回答

3

我回答你的问题的实际以下,但回答问题的根本愿望,你可能寻找Builder模式:

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

这四个模式的原冈之一。

(在上面我内FooBuilder嵌套类,如生成器类和它建立往往是密切相关的东西。但是,这是没有必要的,这是它的工作只是一种方式。)


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

编号变量未传递给您的方法。将变量中包含的从它们中读出,并将那个值传递给你的方法。当它到达你的方法时,没有任何连接返回值的来源(如果实际上它来自一个变量)。

在你的具体的例子,因为他们每个人都有一个独特的类型,你可以检查每个条目中args来看看它的类型和工作从,但它会很奇怪,我止跌” t推荐它。

强调我不会推荐它,这将是这样的:

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; 
    } 
} 

但同样,我不会推荐它,如果我在代码审查碰到它我会想要一个真的,真的很好的理由它。 :-)

+0

我可以使用(键,值)对来匹配我想将它分配给该值的变量吗?所以每个值都在一个集合中,例如<"id", 1234>。如果是这样,我将如何去匹配这些? – Hunter

+1

我认为Builder模式似乎是最好的方式。我遇到的问题是,如果我需要向构造函数添加另一个变量,我必须重构每个构造函数方法,这样我可以添加到构建器中,并且正在使用的构建器继续工作。谢谢! – Hunter

+0

@猎人:是的,这是Builder的动机之一。我不知道GoF现在是否像十年前一样出名,但我指的是[*设计模式:Gamma,Helm,Johnson和Vlissides的可重用面向对象软件的元素](https:// en.wikipedia.org/wiki/Design_Patterns)。 –

相关问题