Java булевы параметры в конфигурации класса - PullRequest
1 голос
/ 01 ноября 2011

Часто класс должен быть настроен с использованием нескольких логических параметров. Каковы рекомендуемые способы в Java для определения конфигураций выполнения?

Я могу придумать 4 способа передачи опций классу.

  1. Использование битовых масок. Эффективный, простой в использовании, но не сгруппированный вместе. Сложнее найти через автозаполнение среди других участников. Ограниченный по размеру.

    public static final int A_ENABLED = 1 << 1;
    public static final int B_ENABLED = 1 << 2;
    
  2. Использование (внутреннего) класса параметров. Трудно создать, слишком многословно.

    public static class Params {
        private final boolean enabledA;
        private final boolean enabledB;
    }
    
    public class MyFunctionality {
        private final SomeOtherArguments myDataArguments;
        ...
        private final Params params;
    
        MyFunctionality(SomeOtherArguments myDataArguments, Params params);
    }
    
  3. Использование логических полей как части класса. Увеличивает многословность класса (дополнительные аргументы в конструкторе, о которых вам нужно беспокоиться). Конструктор класса должен изменяться при каждом изменении параметров. В варианте 2 изменится только класс Params.

    public class MyFunctionality {
        private final SomeOtherArguments myDataArguments;
        ...
        private final boolean enabledA;
        private final boolean enabledB;
        private final boolean enabledC;
        private final boolean enabledD;
        ...
    
        public MyFunctionality(SomeOtherArguments someOtherArguments, boolean enabledA, boolean enabledB, boolean enabledC, boolean enabledD);
    }
    
  4. Использование перечислений.

    public static enum Params {
        OPTION_A, OPTION_B
    }
    

Можете ли вы придумать другие лучшие способы сделать это?

Ответы [ 3 ]

3 голосов
/ 01 ноября 2011

Перечисления и EnumSet специально разработаны для этого.

class myClass {

  public static enum Options {A,B,C};

  private EnumSet optionSet = EnumSet.noneOf(Option.class);

  public setOption(Option o) {
    optionSet.add(o);
  }
  public setOptions(EnumSet addset) {
    optionSet.addAll(addset);
  }

}

optionSet содержит опции, которые «установлены». EnumSet чрезвычайно эффективен, использует только один бит для каждого элемента enum в большинстве реализаций и позволяет получать и устанавливать в постоянное время. Конечно, вы можете ограничить параметры настройки и временем строительства.

РЕДАКТИРОВАТЬ: вы можете установить несколько параметров, таких как A и B одновременно с:

myClassInstance.setOptions(EnumSet.of(A,B));
2 голосов
/ 01 ноября 2011

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

В любом случае, я бы порекомендовал вам комбинировать битовую маску или набор с enum.Перечисление позволяет легче управлять и контролировать возможные значения.Использование метода valueOf(String) позволяет легко реализовать чтение значений из файлов конфигурации.

0 голосов
/ 01 ноября 2011

Как насчет этой реализации

class MyFunctionality {
    private boolean [] options;

    public static final int OPTION1 = 0;
    public static final int OPTION2 = 1;
    public static final int OPTION3 = 2;
    /*Set the default values*/
    public static final boolean [] defaultValues = new boolean[3];
    static {
        defaultValues[OPTION1] = true;
        defaultValues[OPTION2] = false;
        defaultValues[OPTION3] = true;
    }

    MyFunctionality(String something, int somethingelse, boolean [] options) {
        if(options == null) {
            options = defaultValues.clone();
        }
        this.options = options;

        for(boolean value : this.options) {
            System.out.println(value);
        }
    }

    public static boolean [] getModelOptions() {
        return defaultValues.clone();
    }
}

Класс реализации

class MyFunctionImpl {
    public static void main(String [] ars) {
        boolean [] optionsINeedToSet = MyFunctionality.getModelOptions();
        optionsINeedToSet[MyFunctionality.OPTION3] = false;

        new MyFunctionality("Try this", 10101, optionsINeedToSet);
        new MyFunctionality("Try this", 10101, null);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...