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

У меня очень конкретная ситуация. Контекст ситуации таков: я создаю плагин для 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)


arrow_upward
0
arrow_downward

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