假设我有一个类:
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+ 事件的完整列表,而管理员应该只看到有限的数量。
让我们以工作日名称为例作为枚举。见下文
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
对不起,我在电话里,请在回答中格式化代码。
假设您的枚举看起来像
private enum Enums {
A,
B,
C,
D
}
其中 A、B 是特定于管理员的。
创建一个类,该类允许根据此人是否为管理员来访问枚举。
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;
}
枚举集是一种特殊的 Set 实现,针对存储一组枚举进行了优化。adminEnums
存储所有枚举的列表,而nonAdminEnums
具有有限的枚举集。
您必须为 admin 显式指定受限枚举的列表,或者指定打开的枚举并基于此派生另一个枚举。这不仅乏味而且容易出错。将来,当您添加新的枚举实例时,您也必须更新它,并且很容易忘记这一点。
如果枚举本身包含这样的信息会更好,
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());