Как отфильтровать список перечислений по некоторым критериям? - PullRequest
0 голосов
/ 18 июня 2020

Допустим, у меня есть класс:

public enum Enums
{
    // about thousand different Enums 
}

, и у меня есть другой класс, в который входит пользователь, и в зависимости от того, является ли он администратором или обычным пользователем, пользователь имеет доступ к ограниченному список перечислений. Я знаю, что могу получить полный список всех перечислений из класса, но каков элегантный способ отфильтровать их по некоторым критериям, чтобы класс Enums не знал информацию о пользователе?

Изменить: вот фрагмент того, как это выглядит сегодня:

@GET
@RolesAllowed({ADMIN})
@Path("/test")
public Response reply(@Auth User user)
{
    JSONObject jsonObject = new JSONObject();
    jsonObject.put("enums", Arrays.toString(Enums.values()));
    return Response.ok(jsonObject.toJSONString()).build();
}

Я возвращаю полный список из 1000+ событий, когда администратор должен видеть только ограниченное количество.

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Допустим, ваше перечисление выглядит как

private enum Enums {
    A,
    B,
    C,
    D
}

, где A, B указаны администратором c.

Создайте класс, который разрешает доступ к Enum в зависимости от того, является ли человек является администратором или нет.

public class SO {
    EnumSet<Enums> adminEnums = EnumSet.allOf(Enums.class);
    EnumSet<Enums> nonAdminEnums = EnumSet.of(Enums.C, Enums.D);

    public Set<Enums> getEnums(User user) {
        boolean isAdmin = user.isAdmin(); //An example
        return isAdmin ? adminEnums : nonAdminEnums;
    }

EnumSet - это специальная реализация Set, оптимизированная для хранения набора перечислений. adminEnums хранит список всех перечислений, тогда как nonAdminEnums имеет ограниченный набор перечислений.

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

Было бы лучше, если бы сами перечисления содержали эту информацию, например,

private enum Enums {
    A(false),
    B(false),
    C(true),
    D(true);

    private boolean adminSpecific;
    Enums(boolean adminSpecific) {
        this.adminSpecific = adminSpecific;
    }

    public boolean isAdminSpecific() {
        return adminSpecific;
    } 
}

В этом случае мы можем получить список на основе информации, содержащейся в экземпляре перечисления.

Set<Enums> adminEnums = Arrays.stream(Enums.values())
        .filter(Enums::isAdminSpecific)
        .collect(Collectors.toSet());
0 голосов
/ 18 июня 2020

Давайте возьмем для примера название дня недели как enum. См. Ниже.

public enum DaysOfWeekEnum {

    SUNDAY("off"), 
    MONDAY("working"), 
    TUESDAY("working"), 
    WEDNESDAY("working"), 
    THURSDAY("working"), 
    FRIDAY("working"), 
    SATURDAY("off");

    private String typeOfDay;

    DaysOfWeekEnum(String typeOfDay) {
        this.typeOfDay = typeOfDay;
    }

    // standard getters and setters 

    public static Stream<DaysOfWeekEnum> stream() {
        return Stream.Of(DaysOfWeekEnum.values()); 
    }
}

Теперь мы напишем пример для вывода нерабочих дней:

public class EnumStreamExample {

    public static void main() {
        DaysOfWeekEnum.stream()
        .filter(d -> d.getTypeOfDay().equals("off"))
        .forEach(System.out::println);
    }
}

Результат, который мы получим, когда запустим это:

SUNDAY
SATURDAY

Извините, м на телефоне, пожалуйста, отформатируйте код в ответе.

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