如何创建DRYer构造函数

时间:2013-12-10 19:53:17

标签: java list constructor

有什么方法可以让以下任何构造函数重复性降低?即只使用一个构造函数或没有多个'topping.add'调用?我的目标是吃一个可以有1,2或3种不同配料的披萨

private PizzaBase base;
List<PizzaTopping> toppings = new ArrayList<PizzaTopping>();

public Pizza(PizzaBase base, PizzaTopping topping) //Constructor for pizza with 1 topping
{
    setBase (base);
    toppings.add(topping);
}

public Pizza(PizzaBase base, PizzaTopping topping, PizzaTopping topping2) //Constructor for pizza with 2 toppings
{
    setBase (base);
    toppings.add(topping);
    toppings.add(topping2);
}

public Pizza(PizzaBase base, PizzaTopping topping, PizzaTopping topping2, PizzaTopping topping3) //Constructor for pizza with 3 toppings
{
    setBase (base);
    toppings.add(topping);
    toppings.add(topping2);
    toppings.add(topping3);

}

最初我在考虑使用for循环将提供的toppings添加到列表中,但我不确定如何迭代构造函数给出的值

4 个答案:

答案 0 :(得分:5)

使用varargs,您可以根据需要使用尽可能多的浇头,不要在构造函数中担心它,将其视为列表

private PizzaBase base;
List<PizzaTopping> toppings = new ArrayList<PizzaTopping>();

public Pizza(PizzaBase base, PizzaTopping... toppings) //Constructor for pizza with 1 topping
{
    setBase (base);
    for(PizzaTopping topping : topings)
        toppings.add(topping);
}

答案 1 :(得分:3)

使用不带PizzaToppings的构造函数。制作方法addToppings,你可以根据需要调用方法来添加任意数量的浇头。

或者,有一个带有ListToppings列表的构造函数。

答案 2 :(得分:1)

我有一个浇头数组是构造函数的参数之一。

public Pizza(PizzaBase base, PizzaTopping[] topping) {
    setBase(base);
    for (int i = 0; i < topping.length; i++)
    toppings.add(topping[i]);
}

如果你想限制披萨上的配料数量,你可以用if声明来做:

if (topping.length > 3) { /*do the for loop*/ }
else /*Write an error message*/

答案 3 :(得分:0)

绝对看看Builder模式,它是软件设计的经典之作。

Builder on wikipedia http://en.wikipedia.org/wiki/Builder_pattern