java - 对于下面提到的情况,接口(interface)或枚举哪一个是更好的选择?

标签 java enums

Herbert Schildt 提到,虽然这些方法在技术上没有任何问题, 枚举是更好的选择。

考虑以下因素:

选择1:

//可能答案的枚举。

enum Answers {
    NO, YES, MAYBE, LATER, SOON, NEVER
}


public class Question {
    Random rand = new Random();

  Answers ask() {
    int prob = (int) (100 * rand.nextDouble());
    if (prob < 15)
        return Answers.MAYBE; // 15%
    else if (prob < 30)
        return Answers.NO; // 15%
    else if (prob < 60)
        return Answers.YES; // 30%
    else if (prob < 75)
        return Answers.LATER; // 15%
    else if (prob < 98)
        return Answers.SOON; // 13%else
    return Answers.NEVER; // 2%
   }
 }


public class AskMe {
  static void answer(Answers result) {
    switch (result) {
    case NO:
        System.out.println("No");
        break;
    case YES:
        System.out.println("Yes");
        break;
    case MAYBE:
        System.out.println("Maybe");
        break;
    case LATER:
        System.out.println("Later");
        break;
    case SOON:
        System.out.println("Soon");
        break;
    case NEVER:
        System.out.println("Never");
        break;
    }
}

public static void main(String args[]) {
    Question q = new Question();
    answer(q.ask());
    answer(q.ask());
    answer(q.ask());
    answer(q.ask());
}

}

选择2:

public interface SharedConstants {
   int NO = 0;
   int YES = 1;
   int MAYBE = 2;
   int LATER = 3;
   int SOON = 4;
   int NEVER = 5;
}


public class Question implements SharedConstants {

    Random rand = new Random();

   int ask() {
    int prob = (int) (100 * rand.nextDouble());
    if (prob < 30)
        return NO; // 30%
    else if (prob < 60)
        return YES; // 30%
    else if (prob < 75)
        return LATER; // 15%
    else if (prob < 98)
        return SOON; // 13%
    else
        return NEVER; // 2%
  }
}

public class AskMe implements SharedConstants {

   static void answer(int result) {
    switch (result) {
    case NO:
        System.out.println("No");
        break;
    case YES:
        System.out.println("Yes");
        break;
    case MAYBE:
        System.out.println("Maybe");
        break;
    case LATER:
        System.out.println("Later");
        break;
    case SOON:
        System.out.println("Soon");
        break;
    case NEVER:
        System.out.println("Never");
    }
}

public static void main(String args[]) {
    Question q = new Question();
    answer(q.ask());
    answer(q.ask());
    answer(q.ask());
    answer(q.ask());
 }
}

赫伯特·希尔特没有给出同样的理由。 我很困惑为什么关于枚举的选择是更好的选择?

最佳答案

滥用通用数字类型(例如 int)作为枚举从来都不是一个好主意。考虑在 Java 中使用它的唯一原因是性能——当我说性能时,我指的是纳秒。

采用 int 方法会损失很多:enum 是一个成熟的类,可以具有任意方法,从而可以轻松简化和组织代码。您还可以获得完整的类型安全。事实上,优点太多了,如果我试图将它们全部列举出来,这个答案就会太长。

关于java - 对于下面提到的情况,接口(interface)或枚举哪一个是更好的选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26241562/

相关文章:

java - 迭代匹配器正则表达式 Java

java - Angular2 HttpClient 使用 Rest API

具有多个值和值类型的 Javascript 枚举

c++ - 模板类中的枚举

java - 对使用 httpclient 的类进行单元测试

java - SonarQube 插件中未调用 MeasureComputer 扩展

java - 如何从 GetDataTask 返回一个字符串到 onCreate

java - 如何访问内部枚举类覆盖的方法?

java - 如何将枚举 0 映射到 hibernate 状态以获取字符串标识符

c++ - 数组索引时的枚举类性能