Необходимо знать, как лучше всего регистрировать команды

У меня очень конкретная ситуация. Контекст ситуации таков: я создаю плагин для Minecraft и столкнулся с небольшой проблемой дизайна. Я построил иерархию абстрактных классов, интерфейсов и производных от них конкретных классов (на Java, если это имеет значение). Вот общее представление о структуре:

публичный интерфейс ICommandUsage, ICommandPattern, IPermissionNode

(они реализованы таким образом, что каждая команда должна определять правильное использование команды, следовать определенному шаблону для соответствия регулярному выражению и иметь узел разрешений, чтобы отправитель команды мог использовать команду или нет)

общедоступный абстрактный класс Command = базовый класс

общедоступный абстрактный класс ConsoleCommand = производное подмножество класса Command

открытый абстрактный класс PlayerCommand = производное подмножество класса Command

общедоступный абстрактный класс UserCommand = производное подмножество PlayerCommand

общедоступный абстрактный класс ServerAdminCommand = производное подмножество PlayerCommand

Остальные классы представляют собой различные конкретные реализации, определяющие функции из интерфейсов и абстрактных классов.

Вот моя дилемма: при запуске подключаемого модуля «основной» класс регистрирует все команды, чтобы, когда пользователь вводит команду, commandDelegate мог затем интерпретировать команду посредством сопоставления с образцом. Сопоставление с образцом происходит из метода getPattern(), который возвращает строку, полужестко запрограммированную в каждый конкретный класс.

Моя логика такова, что каждый конкретный класс должен отвечать за свои шаблоны, узлы разрешений и использование, поэтому эти методы должны существовать в самих классах.

Основная проблема заключается в том, что когда я регистрирую команды в основном классе, мне приходится передавать нулевые аргументы конструкторам, чтобы создать "фальшивую" команду...

то есть registerCommand("console_info", new ConsoleInfo(null, null));

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


person Zachary L'Anglois    schedule 07.07.2013    source источник


Ответы (1)


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

public class Thing {

private int value;

public Thing(int i) {
    value = i;
}
public Thing() {
    value = 0;
}
}

Поэтому вместо того, чтобы создавать класс с двумя нулевыми значениями для его аргументов, создайте конструктор без аргументов и обработайте этот случай внутри класса. Это облегчит изменение, если в будущем вы решите изменить стандарты для случая, когда класс строится без аргументов.

person Kammeot    schedule 07.07.2013
comment
Сначала у меня было так, что каждый из конкретных классов имел свои собственные пустые конструкторы, однако в итоге я просто установил для двух полей значение null внутри пустого конструктора, что, как мне кажется, по-прежнему является плохой практикой. Меня больше интересовало, есть ли лучший образец для подражания... - person Zachary L'Anglois; 08.07.2013