【问题标题】:What is the most common usage of enums in Java? [closed]Java 中枚举的最常见用法是什么? [关闭]
【发布时间】:2013-08-19 15:31:37
【问题描述】:

在 Java 中使用枚举的最常见的正确方法是什么? 假设我需要在类构造函数或工厂方法参数中使用枚举,我能想到的第一件事就是在我的类中包含 public static enum 并导入它。

package mypackage;
import mypackage.Data.ContentType;

class Data {
  public static enum ContentType { TYPE1, TYPE2, TYPE3 }  

  ContentType type;
  String value;

  public Data( String value, ContentType type ) {
    this.value = value;
    this.type = type;
  }
}

用法示例:new Data( "some value", ContentType.TYPE1 );

人们喜欢使用如下结构的原因是什么?

public static final int TYPE1 = 1;
public static final int TYPE2 = 2;
public static final int TYPE3 = 3;

【问题讨论】:

  • 查看TimeUnit 枚举以及它如何与java.util.concurrent 包一起使用。
  • @AndrewMartin:这不是一个很好的例子;这是一个丑陋但有用的 hack。
  • 当你有一个属性在一个固定和封闭的集合中获取它的值时使用枚举。示例:扑克牌可以是 {SPADES, HEARTS, DIAMONDS, CLUBS}
  • @SLaks:我相信你比我更了解它。为什么它是一个丑陋的黑客?

标签: java coding-style enums


【解决方案1】:

我不愿将此称为“常见”用法,但枚举非常适合制作 some kinds of state machines

【讨论】:

    【解决方案2】:

    好问题。 Enum 最适合用于:

    1. 一组永远不会改变的固定数据。例如月份名称、工作日..等
    2. 防止在字符串中输入错误非常有用。如果您多次输入Januar,您可能会输错,但使用Enum,会在语法上进行检查。

    【讨论】:

      【解决方案3】:
      1. 您可以将枚举用于对象的当前状态,这在您想要实现 FSM 时很有用
      2. 正如 njzk 在评论中所说,枚举允许您创建一组固定的数据
      3. 限制自己使用简单的枚举,不要忘记它们可以有参数和方法

      考虑类似的事情(在现实世界的例子中可能没有用,但它可以向您展示一些功能)

      public enum Operations{ ADD,SUB,...;
       public int execute(int a, int b)
       {
          switch(this)
          {
          case ADD:
           return a+b;
          case SUB:
           return a-b;
               ....
              }
       }
      }
      

      现在你可以有方法了

      public int execute(Operations op,int a, int b)
      {
      return op.execute(a,b);
      }
      

      对于不同的枚举值返回不同的结果

      【讨论】:

        【解决方案4】:

        使用枚举提供了一系列明显的优势,因为编译器会检查你是否在 switch 语句中缺少任何一个,并且不能使用声明的值之外的值。

        有些人可能会出于惯性或因为他们的代码可能被编译成其他语言而继续使用常量。多半是因为他们没有遇到枚举,而且在大多数情况下,Enum 比那些常量要好。

        【讨论】:

          【解决方案5】:

          这是一个我声明为 Enum 的类以及以下几个原因:

          1. 通过组合包含奖项引用的对象不需要在每次添加一个新的奖项对象时创建一个新的奖项对象(阅读 使用枚举与使用单例)。
          2. 由于枚举是实例控制的,当我需要比较奖项时,我可以使用 == 运算符而不是 .equals(),并为自己节省一个 (痛苦的)一点 CPU 时间。
          3. 总的来说,当您有机会重用集合中现有的不可变对象而不是创建新对象时,请使用枚举。
          public enum Award {
              /*List of possible awards */
              FIRST_AWARD("FIRST_AWARD", "FIRST_AWARD_IN_THE_LIST", "./firstAward.jpg"),
              SECOND_AWARD("SECOND_AWARD", "SECOND_AWARD_IN_THE_LIST", "./secondAward.jpg"),
              THIRD_AWARD("THIRD_AWARD", "THIRD_AWARD_IN_THE_LIST", "./thirdAward.jpg");      
          
              private final String name;
              private final String description;
              private final String imageLink; 
          
              Award (String name, String description, String imageLink){
                  this.name = name;
                  this.description = description;
                  this.imageLink = imageLink;
              }
          
          ...
          }
          

          【讨论】:

            猜你喜欢
            • 2013-10-12
            • 2010-10-16
            • 2020-05-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多