Я пишу API игры, и я хотел бы, чтобы там было перечисление элементов управления. Я хочу определить основные элементы управления (JUMP, MOVE_LEFT), но конечный разработчик должен иметь возможность добавлять другие элементы управления (DANCE, SHOOT).
Итак, как я могу позволить конечному программисту добавить в мой список, не касаясь моего первоначального файла перечисления?
Как указывает связанный ответ, вы не можете напрямую распространять перечисление.
В вашем вопросе не так много информации, но вот как я подхожу к проблеме. Надеюсь, это принесет некоторую пользу.
Сначала я бы определил абстракцию, чтобы инкапсулировать фактическую логику, которая выполняется для каждого "элемента управления".
interface Behaviour {
void invoke();
}
Объекты, реализующие этот интерфейс, переопределяют метод invoke()
чтобы обеспечить фактическую логику управления, например перемещение игрового объекта влево или вправо.
В вашем API может быть метод, подобный описанному ниже, который выполняет любое действие, подходящее для элемента управления, на который вызывается метод.
public void moveObjectAccordingTo(Behaviour behaviour) {
behaviour.invoke();
// Whatever else you want to do...
}
Перечисление, содержащее элементы управления по умолчанию, может затем реализовать этот интерфейс, что-то вроде этого:
public enum Controls implements Behaviour {
JUMP("Player jumped..."),
MOVE_LEFT("Player moved left..."),
MOVE_RIGHT("Player moved right...");
private final String message;
Controls(String message) {
this.message = message;
}
@Override
public void invoke() {
System.out.println(message);
}
}
Это позволяет использовать предыдущий метод следующим образом:
public void moveObjectAccordingTo(Controls.JUMP);
Теперь вы хотите, чтобы разработчики могли добавлять свои собственные дополнительные элементы управления в систему, не затрагивая перечисление. Все, что вам нужно сделать, это реализовать интерфейс Behaviour
и переопределить метод invoke
. Как это:
public class DanceControl implements Behaviour {
@Override
public void invoke() {
System.out.println("Player is dancing...");
}
}
Новое поведение может быть использовано без изменения исходного перечисления или без изменения API.
public void moveObjectAccordingTo(new DanceControl());
Ваш подход не является хорошим, потому что в Java вы не можете расширять перечисление. Тип Enum в Java является окончательным по дизайну.
Подробнее о перечислении вы можете найти в официальной документации.
Итак, по дизайну, тип перечисления должен иметь только элементы, объявленные в перечислении.
Вместо этого вы должны рассмотреть возможность использования интерфейсов в вашем подходе.
enum
.