Есть фиксированные параметры в конструкторе Java - возможно? - PullRequest
2 голосов
/ 12 апреля 2011

Я определил объект в 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);
    }

}

и т. Д. И т. Д.

Я надеюсь, что это имеет какой-то смысл - это немного, и Googling предлагает только ссылки на общедоступную статическую пустоту и т. Д. Если кто-то, обладающий немного большим опытом / ноу-хау в Java, чем я, сможет взглянуть на него, то у него появится вечная любовь и благодарность.

Ответы [ 6 ]

5 голосов
/ 12 апреля 2011

Другой подход состоит в том, чтобы избежать использования конструктора здесь и создать статический метод фабрики, который вызывает приватный конструктор:

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;
    }
3 голосов
/ 12 апреля 2011

Если я правильно понял ваш сценарий, вы можете подумать о рефакторинге этого подхода.

Сделайте MenuNode базовым классом и наследуйте от него ваши подтипы (MenuNodeType1, MenuNodeType2 и т. Д.).).Таким образом, вы получите контроль над отдельными типами, но вы все равно можете выбросить их в одну коллекцию.

1 голос
/ 12 апреля 2011

Подумайте об использовании фабричных методов для создания MenuNodes:

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

public MenuNode createTypeTwoMenuNode(Object paramx, Object paramy) {
    ...
}
1 голос
/ 12 апреля 2011

Если я вас правильно понимаю, вам нужно ограничение, что значение первого аргумента для каждого конструктора должно соответствовать вызываемому конструктору.

Simple:

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 голосов
/ 12 апреля 2011

Другое решение, если ваши конструкторы трудно различить, - это использовать статические фабричные методы, потому что они могут иметь описательные имена. Но, как упомянул Бобби, похоже, это больше подходит для рефакторинга нескольких типов.

0 голосов
/ 12 апреля 2011

Возможно, вы ищете метод перегрузки

Я не понимаю, почему вам нужно добавить тип к вызову -> если вы вызываете его с параметрами X, вы знаете, какой это должен быть тип, верно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...