Как я могу представить глобальное перечисление как подкласс нескольких классов? - PullRequest
0 голосов
/ 22 апреля 2011

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

public static final class ResponseControl { 
    public static enum EventStatus {
        EVENT_RECEIVED,
        EVENT_STARTED,
        EVENT_COMPLETED;
    }
}

Удобно включить enum EventStatusOption в качестве подкласса класса ResponseControl, потому что это то, что определено в документе стандартов, и именно там люди будутискать это.Это позволяет им говорить что-то вроде:

if (respCtl.status == ResponseControl.EventStatus.EVENT_STARTED) { ... }

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

public static enum GlobalEventStatus {
    EVENT_RECEIVED,
    EVENT_STARTED,
    EVENT_COMPLETED;
}
public static final class ResponseControl { 
    public static enum EventStatus extends GlobalEventStatus {}
    public final EventStatus status;
}

if (respCtl.status == ResponseControl.EventStatus.EVENT_STARTED) { ... }

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


Второй абзац ответа ColinD ниже - это тот ответ, который мне был нужен.Сказав:

public interface GlobalEvent
{
    public static enum Status {
        EVENT_RECEIVED,
        EVENT_STARTED,
        EVENT_COMPLETED;
    }
}

public static final class ResponseControl {
    public static enum Event implements GlobalEvent
    public final Event.Status status;
}

, я могу позволить своим пользователям сказать:

if (respCtl.status == ResponseControl.Event.Status.EVENT_STARTED) { ... }

... все, сохраняя при этом фактические определения в одном месте.Спасибо.

1 Ответ

2 голосов
/ 22 апреля 2011

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

Если то, что вы ищете, это общий набор констант enum, а затем подклассы, которые определяют дополнительные константы, специфичные для определенного класса ... ну, вам там почти не повезло. Вы не можете сделать это с помощью перечислений. Один из вариантов (не говоря уже о том, что он лучший) - сделать EventStatus интерфейсом, а затем GlobalEventStatus быть перечислением, которое реализует этот интерфейс. После этого вы можете получить другое перечисление ResponseControl.Status или что-то подобное, которое также реализует EventStatus.

Я должен также упомянуть, что что-то вроде ResponseControl.EventStatus это не "подкласс", а "вложенный класс".

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