【问题标题】:Require input regarding JAVA ENUMS需要有关 JAVA ENUMS 的输入
【发布时间】:2015-02-04 10:54:23
【问题描述】:

考虑以下

public enum  tc implements  {
  NORESULTS(0), GOOD_RESULTS(1), EXCELLENT_RESULTS(2), NO_DATA_AVAILABLE(5), SOME_OTHER_VALUE(4);
    private final Integer value;
    // Code for the constructor, getters and setters for the value****

枚举tc 值对应于下面类中的testValue。

    public class TestData {
       private int testID;
       private String testName;
       private int testValue;
       ....
      ...

    }

在 Results 类中,TestDataList 必须按不同的排名顺序排序,而不是 testValue。例如,Excellent 后跟 Good Results 后跟 NoResults 等。

public class Results {

List<TestData> TestDataList = getTestData();

我可以为比较器等编写代码。问题是因为我需要对枚举进行不同的排序,以下两个选项中哪个更好 a) 在枚举 tc 中添加私有 int rankTestValue。此选项可能要求我必须编写一个 getRank(int value) 方法,该方法将根据该值返回相应的 rankTestValue。

或 b) 在结果类中添加一个映射 Map tcRankMap = new HashMap();。使用 (2,1) (1,2) 等对应于(枚举值,排名)的键值填充此地图。例如,(2,1) 将是优秀_结果具有第一排名等。

这两个选项哪个更好。如果有更好的解决方案,请告诉我。

【问题讨论】:

  • 所以您想根据tc 值对TestData 实例进行排序,但tc 值的顺序不固定?
  • 我不明白为什么 testValue 被声明为 int 而不是 tc。你能解释一下吗?
  • 所以你的问题真的是'为一个不同于它的自然排序的枚举定义一个比较器的优雅方法是什么?对吗?

标签: java enums


【解决方案1】:

选项 (a) 看起来更好,并且符合面向对象的分析和设计。

【讨论】:

    【解决方案2】:

    好消息是,这是一个实现细节的问题,无论如何都可以封装到您的Comparator 中,所以这并不重要。

    至于风格和可读性,我更喜欢(a),但这取决于个人喜好。

    还有一个解决方案(c)——使用ordinal(),然后根据排名对其进行排序。只需添加评论以使其清楚

    public enum  tc implements  {
        // NB: enum values are sorted according to rank
        EXCELLENT_RESULTS(2),
        GOOD_RESULTS(1),
        NORESULTS(0),
        NO_DATA_AVAILABLE(5),
        SOME_OTHER_VALUE(4);
    
        private final Integer value;
        // Code for the constructor, getters and setters for the value****
    }
    

    【讨论】:

      【解决方案3】:

      您的第一个选项如下所示:

      enum TestScore {
          EXCELLENT(5),
          NO_RESULT(2),
          POOR(1);
          private final int order;
          private TestScore(int order) {
              this.order = order;
          }
          public int compareOrderTo(TestScore other) {
              return this.order - other.order;
          }
      }
      

      然后您可以向 TestData 添加一个比较方法

      public int compareTestScore(TestData other) {
          return this.testScore.compareOrderTo(other.testScore);
      }
      

      并使用以下命令对您的列表进行排序:

      Collections.sort(testData, TestData::compareTestScore);
      

      问题在于order 字段确实是完全任意的,每次添加新条目时都需要更新。然而,这绝对比使用枚举的自然顺序更好、更明确(即它是序数值,应该完全是偶然的,以避免脆弱性)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-16
        • 1970-01-01
        • 1970-01-01
        • 2018-05-13
        • 1970-01-01
        • 2022-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多