簡體   English   中英

在Java構造函數中有固定的參數 - 可能嗎?

[英]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成為基類,並從中繼承您的子類型( MenuNodeType1MenuNodeType2等)。 這樣你就可以控制單個類型,但你仍然可以將它們全部放入一個集合中。

如果我理解正確,你需要約束,即每個構造函數的第一個參數的值必須與被調用的構造函數匹配。

簡單:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM