在Java构造函数中有固定的参数 - 可能吗?

时间:2011-04-12 11:40:59

标签: java constructor

我在Java中定义了一个对象 - 就Java而言,它们是相同的,但就填充它们的数据而言,它们可以是三种类型之一(俗称1) ,2,3为“根”的0 我真正希望能够做的是定义了四个构造函数,因为它们需要每种类型略有不同的参数。我可以用战略空值做到这一点,但这似乎是错误的做法。我喜欢的是:

public MenuNode(int type = 1, param1, param2, param3) {
    doStuffHere();
} 
public MenuNode(int type = 2, paramX, paramY) {
    doStuffHere();
}

然后调用以下内容:

switch (toQueue.itemType) {

    when ITEM_TYPE_STATIC {
        MenuNode mn1 = new MenuNode(ITEM_TYPE_STATIC, param1, param2, param3);
    }

    when ITEM_TYPE_DYNAMIC {
        MenuNode mn2 = new MenuNode(ITEM_TYPE_DYNAMIC, paramX, paramY);
    }

}

等等。

我希望这有点道理 - 它有点像,谷歌搜索只提到公共静态空白等。 如果有人比我有更多经验/专业知识的人可以看一看,那将会有永恒的爱和感激。

6 个答案:

答案 0 :(得分:5)

另一种方法是避免在这里使用构造函数,并创建一个调用私有构造函数的静态工厂方法:

class MenuNode {
    private MenuNode() {
        // Does nothing important
    }
    public static MenuNode createStatic(param1, param2, param3) {
         MenuNode result = new MenuNode();
         result.setItemType(ITEM_TYPE_STATIC);
         result.setParam1(param1);
         result.setParam2(param2);
         result.setParam3(param3);
         result.doStuffHere();
         return result;
    }
    public static MenuNode createDynamic(paramX, paramY) {
         MenuNode result = new MenuNode();
         result.setItemType(ITEM_TYPE_DYNAMIC);
         result.setParamX(paramX);
         result.setParamY(paramY);
         result.doStuffHere();
         return result;
    }

答案 1 :(得分:3)

如果我理解你的方案是正确的,你可能想要重构这种方法。

使MenuNode成为基类,并从中继承您的子类型(MenuNodeType1MenuNodeType2等)。这样你就可以控制单个类型,但你仍然可以将它们全部放入一个集合中。

答案 2 :(得分:1)

如果我理解正确,你需要约束,即每个构造函数的第一个参数的值必须与被调用的构造函数匹配。

简单:

public MenuNode(int type, param1, param2, param3) {
    if (type != 1) throw new IllegalArgumentException ("type must be 1")
    doStuffHere();
} 
public MenuNode(int type, paramX, paramY) {
    if (type != 2) throw new IllegalArgumentException ("type must be 2")
    doStuffHere();
}

如果您有两种或更多类型具有相同的参数列表,则验证看起来更像是这样;

    if (type != 1 && type != 3) throw new IllegalArgumentException ("type must be 1 or 3");

答案 3 :(得分:1)

考虑使用工厂方法构建MenuNodes

public MenuNode createTypeOneMenuNode(Object param1, Object param2, Object param3) {
    ...
}

public MenuNode createTypeTwoMenuNode(Object paramx, Object paramy) {
    ...
}

答案 4 :(得分:0)

您可能正在寻找method overloading

我不明白为什么你需要在通话中添加类型 - >如果你用X参数调用它,你知道它应该是什么类型。对吧?

答案 5 :(得分:0)

如果您的构造函数难以区分的另一种解决方案是使用静态工厂方法,因为它们可以具有描述性名称。但正如Bobby所说,这似乎更适用于重构多种类型。