Использование вида диапазона в Java Enum - PullRequest
0 голосов
/ 14 февраля 2019

Я могу определить значения перечисления с конкретными значениями типа int, но я также хочу представить некоторый конкретный диапазон в перечислении Java.Я имею в виду следующее:

public enum SampleEnum {
    A(1),
    B(2),
    C(3),
    D(4),
    //E([5-100]);

    private SampleEnum(int value){
        this.value = value;
    }

    private final int value;
}

Здесь, например, можно ли представить диапазон между 5 и 100 одним значением (здесь это «E») или есть лучшееспособ

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Похоже, вы на самом деле имеете дело с диапазонами для всех перечислений.Единственная разница между E и остальными состоит в том, что остальные имеют только одно значение в диапазоне.

Я бы изменил перечисления, чтобы они взяли либо low/high, либо какой-то Range объект.

Вот пример использования IntStream.range, который мне нравится из-за возможности использования всех его приятных встроенных функций IntStream.

public enum SampleEnum {
    A( () -> IntStream.range(1, 2) ),
    B( () -> IntStream.range(2, 3) ),
    C( () -> IntStream.range(3, 4) ),
    D( () -> IntStream.range(4, 5) ),
    E( () -> IntStream.range(5, 101) );

    private Supplier<IntStream> rangeFactory = null;

    private SampleEnum(Supplier<IntStream> rangeFactory){
        this.rangeFactory = rangeFactory;
    }

    public IntStream getRange() {
        return rangeFactory.get();
    }
}

А вот пример использования для проверкиесли число находится в пределах диапазона:

    assertFalse( SampleEnum.A.getRange().anyMatch( i -> i == 0) );
    assertTrue( SampleEnum.A.getRange().anyMatch( i -> i == 1) );
    assertFalse( SampleEnum.A.getRange().anyMatch( i -> i == 2) );

    assertFalse( SampleEnum.C.getRange().anyMatch( i -> i == 2) );
    assertTrue( SampleEnum.C.getRange().anyMatch( i -> i == 3) );
    assertFalse( SampleEnum.C.getRange().anyMatch( i -> i == 4) );

    assertFalse( SampleEnum.E.getRange().anyMatch( i -> i == 4) );
    assertTrue( SampleEnum.E.getRange().anyMatch( i -> i == 5) );
    assertTrue( SampleEnum.E.getRange().anyMatch( i -> i == 100) );
    assertFalse( SampleEnum.E.getRange().anyMatch( i -> i == 101) );
0 голосов
/ 14 февраля 2019

Числа 5 и 100 - это два разных значения, поэтому сохранение одного значения здесь не сработает.

Но достаточно просто определить два значения в перечислении: низкое и высокое.Для тех, у кого диапазон всего один, установите для высокого и низкого значения одинаковое значение.

enum SampleEnum {
    A(1),
    B(2),
    C(3),
    D(4),
    E(5, 100);

    private SampleEnum(int value){
        this.low = value;
        this.high = value;
    }
    private SampleEnum(int low, int high) {
        this.low = low;
        this.high = high;
    }

    private final int low;
    private final int high;
}
...