Допустим, ваше перечисление выглядит как
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());