2013-08-18 2 views
0

Для эталона мне нужны три разных настройки («держать все», «держать размер» и «ничего не держать»), поэтому я мог использовать перечисление. Затем я увидел, что мне нужно несколько раз запускать несколько случаев (в тесте используется случайный выборка), а исходное перечисление получилось довольно негибким. Для Caliper, мне нужно повторить элементы перечисления. После некоторых попыток не удалось сделать это правильно, я закончил с этой Hacky идея:Можно ли улучшить это хакерское перечисление?

private enum Randomization { 
    USE_EXAMPLE_1, 
    USE_EXAMPLE_2, 
    KEEP_EXAMPLE_SIZE_1, 
    RANDOM_1, 
    RANDOM_2, 
    RANDOM_3, 
    ; 

    final boolean keepAll; 
    final boolean keepSize; 

    private Randomization() { 
     keepAll = name().startsWith("U"); 
     keepSize = !name().startsWith("R"); 
    } 
} 

Это именно то, что я хочу, я могу добавить или удалить эксперименты с минимальными затратами. Есть ли более приятное решение?

ответ

1

Есть ли более приятное решение?

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

Другим вариантом было бы иметь перечисление как текущего, и более логичным перечислений, где конструктор с «повторяющейся» перечислимого принимает ссылку на экземпляр «логического» один вместо этого.

Если вы действительно, действительно хотите сохранить текущую структуру, я бы лично канаву вывод из keepSize и keepAll частей, и использовать параметризованные конструктор вместо:

private enum Randomization { 
    USE_EXAMPLE_1(true, true), 
    USE_EXAMPLE_2(true, true), 
    KEEP_EXAMPLE_SIZE_1(false, true), 
    RANDOM_1(false, false), 
    RANDOM_2(false, false), 
    RANDOM_3(false, false), 
    ; 

    final boolean keepAll; 
    final boolean keepSize; 

    private Randomization(boolean keepAll, boolean keepSize) { 
     this.keepAll = keepAll; 
     this.keepSize = keepSize; 
    } 
} 
+0

* заполнить коллекцию * - Как правило, да, но как я могу заставить Caliper работать с ним? Я могу написать «рандомизацию рандомизации @Param», и он пробует все значения. Это также работает для 'boolean', но для чего-то еще вам нужно перечислить (как строковые аргументы для аннотации) значения, которые будут использоваться. – maaartinus

+0

@maaartinus: Я не использовал Caliper, но я был бы очень удивлен, если бы это был действительно лучший способ сделать это. –

+0

Было бы плохой идеей, если бы мне было нужно сказать пять или более повторений. Но я только хотел попробовать несколько семян для рандомизированных экспериментов и одно испытание для детерминированных. – maaartinus

1

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

private enum Randomization { 
    USE_EXAMPLE_1(1), 
    USE_EXAMPLE_2(2), 
    // ... 

    private final int flag; 

    Randomization(int flag) { 
     this.flag = flag; 
    } 
} 

Это позволяет избежать проблем потенциального рефакторинга переименования значения enum и не привязывает вас к имени.