2011-04-12 61 views
2

我已经在Java中定义了一个对象 - 就Java而言,它们是相同的事物,但就填充它们的数据而言,它们可以是三种类型之一(全称为1, “0”代表“根”)。
我真的希望能够做到的是定义了四个构造函数,因为它们需要每个类型稍微不同的参数。我可以用战略性的空值来实现,但这似乎是错误的做法。我很想有是这样的:在Java构造函数中有固定参数 - 可能吗?

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

} 

等等等等

我希望这是某种形式的意义 - 它有点出来,谷歌搜索只提到公共静态无效等 如果有人比我有更多的Java经验/诀窍可以看一看,永恒的爱和感激之情即将到来。

回答

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

辉煌 - 非常感谢! <3承诺。 – 2011-04-12 12:38:20

0

您可能正在寻找method overloading

我不明白为什么你需要的类型添加到呼叫 - >如果你有X的参数调用它,你知道什么类型应该是吧?

+0

那么,在技术上它的构造函数重载没有方法重载,因为构造函数是不是方法。 – 2011-04-12 11:46:22

+0

确实如此,但使用术语方法重载时更容易找到信息。 – Nanne 2011-04-12 11:51:44

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"); 
+0

用于检查以上构造函数的健全性 - 所以我欠你一些<3! – 2011-04-12 17:50:30

3

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

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

0

如果你的构造变得难以distinquish另一种解决方案是使用静态工厂方法,因为这些可以有描述性的名字。但正如Bobby所说,这似乎更适合重构多种类型。

1

考虑使用工厂方法来构建你的MenuNodes

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

public MenuNode createTypeTwoMenuNode(Object paramx, Object paramy) { 
    ... 
} 
相关问题