Разрешение конечному программисту расширять перечисление API [duplicate]

1

Я пишу API игры, и я хотел бы, чтобы там было перечисление элементов управления. Я хочу определить основные элементы управления (JUMP, MOVE_LEFT), но конечный разработчик должен иметь возможность добавлять другие элементы управления (DANCE, SHOOT).

Итак, как я могу позволить конечному программисту добавить в мой список, не касаясь моего первоначального файла перечисления?

  • 0
    Вы не можете, пока все еще используете enum .
Теги:
enums

2 ответа

1
Лучший ответ

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

В вашем вопросе не так много информации, но вот как я подхожу к проблеме. Надеюсь, это принесет некоторую пользу.

Сначала я бы определил абстракцию, чтобы инкапсулировать фактическую логику, которая выполняется для каждого "элемента управления".

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());
1

Ваш подход не является хорошим, потому что в Java вы не можете расширять перечисление. Тип Enum в Java является окончательным по дизайну.

Подробнее о перечислении вы можете найти в официальной документации.

Итак, по дизайну, тип перечисления должен иметь только элементы, объявленные в перечислении.

Вместо этого вы должны рассмотреть возможность использования интерфейсов в вашем подходе.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню