【问题标题】:Set multiple priorities to an Enum | JAVA为枚举设置多个优先级 | JAVA
【发布时间】:2021-11-25 05:26:32
【问题描述】:

我的州的流程如下所示。其中 A、B、C、D、X 是用作枚举的状态。

A -> B -> C -> D -> E

    A -> X  
    B -> X
    C -> X
    D -> X

表示状态可达的箭头。即 A -> X 意味着 A 可以到达 X 但反之则不行。 我正在实施的方式是:

public enum States{
    A(0), B(1), C(2), D(3);
    private int priority;
    …
    }

有一个浮动状态 X,可以从 A、B、C 和 D 到达。 我想以上述方式设置 X 的优先级。有没有办法这样做? IE。为单个枚举设置多个优先级。

【问题讨论】:

  • 仅当您为其编写代码时。我不确定你在问什么——你已经设计了自己的优先系统,所以你必须以适合你的用例的方式来实现它。您当然不能将一个 int 设置为多个值,因此您必须至少在一定程度上调整您的设计。
  • “浮动状态”是指不是枚举值之一的状态吗?您的代码将如何同时处理枚举和另一个类?它们是否有一个通用的接口,或者您是否需要一直检查类型?顺便说一句,我不确定int 是表达单向“流”的最佳方式。

标签: java spring spring-boot java-8 enums


【解决方案1】:

不要使用整数来定义图形,特别是如果它是单向的,我建议你实际使用引用。

但是,由于枚举值只能引用其构造函数中已经存在的值,因此您要么必须向后声明依赖项,要么使用初始化块。

“向后”:

//backwards dependency
enum State {
  A,
  B(A),
  C(B),
  D(C),
  X(A,B,C,D);

  private List<State> successors = new ArrayList<>();

  private State(State... predecessors) {
    Arrays.stream(predecessors).forEach(p -> p.successors.add(this));
  }

  ...
}

//backwards declaration
enum State {
  X,
  D(X),
  C(D,X),
  B(C,X),
  A(B,X);

  private List<State> successors;

  private State(State... successors ) {
    this.successors = List.of(successors);
  }

  ...
}

静态初始化器

enum State {
  A,B,C,D,X;

  private List<State> successors = new ArrayList<>();

  static {
    A.successors.addAll(List.of(B,X));
    B.successors.addAll(List.of(C,X));
    C.successors.addAll(List.of(D,X));
    D.successors.addAll(List.of(X));
  }

  ...
}

如果X 不是枚举的一部分,您需要定义一个通用接口并将其用作successors 的类型。

【讨论】:

    猜你喜欢
    • 2013-05-06
    • 2023-03-18
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多