Генерация перечислений во время компиляции в Java - PullRequest
1 голос
/ 07 марта 2019

У меня есть перечисление Color, которое имеет около 40 цветов: BLACK, WHITE, RED и т. Д.

У меня есть второе перечисление ColorListPreset, которое содержит связкунаборов Color с, таких как PRIMARY, SECONDARY, ALL, ONLY_WHITE, NOT_WHITE.Мой вопрос касается этих двух последних записей.

Для каждого Color я хочу, чтобы ColorListPreset содержал запись ONLY_ (коллекция размера 1) и запись NOT_ (коллекция размера n-1, например, все Color с, кроме WHITE).Сегодня у нас есть только пара NOT_ записей, но мы хотели бы иметь по одной на Color.

. В настоящее время эти коллекции создаются вручную, но в идеале эти два типа будут автоматически генерироваться из Color enum, оставаясь доступным через ColorListPreset.NOT_WHITE таким образом, что моя IDE распознает.

В качестве аргумента, скажем, что доступ к этим значениям через членский доступ (например, ColorListPreset.NOT_WHITE) важнее, чемусилия, которые идут на поддержание коллекций.

Есть ли способ сделать это?Чисто Java решение идеально.Приветствуются решения, изменяющие тип ColorListPreset, при условии, что доступ к элементу поддерживается.

Лучшая идея, с которой я пришел (хотя я еще не пытался реализовать), - перечислитьONLY_ и NOT_ перечисляются только в имени, затем генерируют свои коллекции в конструкторе с помощью this.name() и Color.values().У меня нет концепции, где генерируются даже имена перечислений.


Текущие примеры кода:

public enum Color {
    BLACK("black", "0x000000"),
    GRAY("gray", "0x7f7f7f"),
    WHITE("white", "0xffffff"),
    RED("red", "0xff0000"),
    GREEN("green", "0x00ff00"),
    BLUE("blue", "0x0000ff");
    // and so on...
}
public enum ColorListPreset {
    NONE(Util.arrayListOf()),
    ALL(Util.arrayListOf(Color.BLACK, Color.GRAY, Color.WHITE, Color.RED, Color.GREEN, Color.BLUE)),
    GRAYSCALE(Util.arrayListOf(Color.BLACK, Color.GRAY, Color.WHITE)),
    PRIMARY(Util.arrayListOf(Color.RED, Color.GREEN, Color.BLUE)),

    ONLY_WHITE(Util.arrayListOf(Color.WHITE)),
    NOT_WHITE(Util.arrayListOf(Color.BLACK, Color.GRAY, Color.RED, Color.GREEN, Color.BLUE));
    // and so on...
}

Util.arrayListOf(T... values) - это просто оболочка вокруг new ArrayList<T>(Arrays.asList(values)).

Одним из мотивов перечисления ColorListPreset является синтаксический сахар, например, для XML-файлов.Итак, здесь действуют внешние силы.

1 Ответ

1 голос
/ 07 марта 2019

Я бы предложил вам заменить ColorListPreset на какого-нибудь "строителя" для Set<Color> или List<Color>.Это не должно быть перечисление.

public class ColorListPreset {
    public static Set<Color> only(Color color) {
        return EnumSet.of(color);
    }

    public static Set<Color> not(Color color) {
        return EnumSet.complementOf(EnumSet.of(color));
    }

    // methods that return other color sets...
}

Пример использования: для ColorListPreset.NOT_WHITE вы должны написать ColorListPreset.not(Color.WHITE).

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