[英]Have fixed parameters in Java constructor - possible?
我在Java中定义了一个对象 - 就Java而言,它们是相同的,但就填充它们的数据而言,它们可以是三种类型之一(命名为1,2, 3为0表示“root”)。
我真正希望能够做的是定义了四个构造函数,因为它们需要每种类型略有不同的参数。 我可以用战略空值做到这一点,但这似乎是错误的做法。 我喜欢的是:
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可以看看,永恒的爱并将表达感激之情。
另一种方法是避免在这里使用构造函数,并创建一个调用私有构造函数的静态工厂方法:
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;
}
如果我理解你的场景是正确的,你可能想要重构这种方法。
使MenuNode
成为基类,并从中继承您的子类型( MenuNodeType1
, MenuNodeType2
等)。 这样你就可以控制单个类型,但你仍然可以将它们全部放入一个集合中。
如果我理解正确,你需要约束,即每个构造函数的第一个参数的值必须与被调用的构造函数匹配。
简单:
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");
考虑使用工厂方法构建MenuNodes
:
public MenuNode createTypeOneMenuNode(Object param1, Object param2, Object param3) {
...
}
public MenuNode createTypeTwoMenuNode(Object paramx, Object paramy) {
...
}
您可能正在寻找方法重载
我不明白为什么你需要在调用中添加类型 - >如果用X参数调用它,你知道它应该是什么类型。对吧?
如果您的构造函数难以区分的另一种解决方案是使用静态工厂方法,因为它们可以具有描述性名称。 但正如Bobby所说,这似乎更适用于重构多种类型。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.