[英]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.