Как определить функцию, возвращающую массив значений перечисления, используя дочерний тип (перечисление реализует интерфейс)? - PullRequest
0 голосов
/ 23 декабря 2019

У меня есть пул многих параметров конфигурации, и у каждого параметра конфигурации есть пул параметров конфигурации. В идеале я хочу иметь возможность установить параметр, используя что-то вроде sendConfiguration (ID, OPTION).

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

public enum Configuration {

    BRIGHTNESS(166, BrightnessConfigOptions.values());

    private int configurationID;
    private ConfigOption[] configOptions;

    Configuration(int configurationID, ConfigOption[] configOptions) {
        this.configurationID = configurationID;
        this.configOptions = configOptions;
    }

    public int getConfigurationID() { return configurationID; }
    public ConfigOption[] getConfigOptions() { return configOptions; }
}

BrightnessConfigOptions выглядит следующим образом:

public enum BrightnessConfigOptions implements ConfigOption {
    DARK(1),
    NORMAL(2),
    BRIGHT(3),
    VERY_BRIGHT(4);

    private int configValue;

    BrightnessConfigOptions(int configValue) {
        this.configValue = configValue;
    }

    @Override
    public int getConfigValue() { return configValue; }
}

А интерфейс ConfigOption выглядит следующим образом:

public interface ConfigOption {
    int getConfigValue();
}

Итак, в качестве примера, желаемое использование будет:

sendConfiguration(Configuration.BRIGHTNESS, Configuration.BRIGHTNESS.getConfigOptions().DARK)
...
void sendConfiguration(Configuration configuration, ConfigOption configOption) {
    System.out.println(configuration.getConfigurationID());
    System.out.println(configOption.getConfigValue());
}

Этот код работает неправильно, потому что getConfigOptions возвращает ConfigOption[], и поэтому я не знаютипа, поэтому я не могу написать .DARK без предварительного приведения.

Либо мой дизайн здесь неправильный, либо я забыл что-то синтаксическое, что сделало бы это намного проще. Как мне сделать так, чтобы набор текста работал элегантно?

1 Ответ

0 голосов
/ 23 декабря 2019

Исходя из вашего примера, это может показаться так, как вы просили.

Я также рекомендую вам изучить EnumSet и EnumMap , поскольку они могут предоставить дополнительные альтернативы. .

interface ConfigOption {
   int getConfigValue();
}
enum BrightnessConfigOptions implements ConfigOption {
   DARK(1), NORMAL(2), BRIGHT(3), VERY_BRIGHT(4);

   private int configValue;

   BrightnessConfigOptions(int configValue) {
      this.configValue = configValue;
   }

   public int getConfigValue() {
      return configValue;
   }
}

enum ColorConfigOptions implements ConfigOption {
    RED(10), BLUE(20), GREEN(30);

   private int configValue;

   ColorConfigOptions(int id) {
      this.configValue = id;
   }
   public int getConfigValue() {
      return configValue;
   }
}

enum Configuration {

   BRIGHTNESS(166), COLOR(167);

   private int configurationID;

   private Configuration(int id) {
      this.configurationID = id;
   }
   public int getConfigurationID() {
      return configurationID;
   }

}

public class EnumMapDemo {


   public static void main(String[] args) {
      new EnumMapDemo().start();
   }
   public void start() {

      sendConfiguration(Configuration.BRIGHTNESS, BrightnessConfigOptions.DARK);
      sendConfiguration(Configuration.BRIGHTNESS, BrightnessConfigOptions.BRIGHT);
      sendConfiguration(Configuration.COLOR, ColorConfigOptions.RED);

   }

   void sendConfiguration(Configuration configuration,
         ConfigOption c) {
      System.out.println(configuration.getConfigurationID());
      System.out.println(c.getConfigValue());
   }
}

...