加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

了解Java中的枚举

发布时间:2020-12-15 07:39:01 所属栏目:Java 来源:网络整理
导读:什么是 java枚举?他们是如何工作的?我在哪里可以使用它们以及如何? 我可以不在应用程序中使用枚举,或者它们是如此强大以至于使用它们比忽略它们更好吗? 解决方法 Java 5中的枚举基本上是具有预定义实例集的类.它们旨在替代整数常量的集合.它们最好是常数
什么是 java枚举?他们是如何工作的?我在哪里可以使用它们以及如何?
我可以不在应用程序中使用枚举,或者它们是如此强大以至于使用它们比忽略它们更好吗?

解决方法

Java 5中的枚举基本上是具有预定义实例集的类.它们旨在替代整数常量的集合.它们最好是常数,因为它们可以强制类型安全.

所以代替:

public class Suit {
  public final static int SPADES = 1;
  public final static int CLUBS = 2
  public final static int HEARTS = 3;
  public final static int DIAMONDS = 4;
}

你有:

public enum Suit {
  SPADES,CLUBS,HEARTS,DIAMONDS
}

优点是:

>类型安全.您可以将函数参数,返回类型,类成员或局部变量声明为特定的枚举类型,编译器将强制执行类型安全;
>枚举基本上是课程.他们可以实现接口,具有行为等.

类型安全是一个问题,因为在第一个示例中,这些是有效的语句:

int i = Suit.DIAMONDS * Suit.CLUBS;

或者你可以将11传递给期待西装的功能.你不能用类型安全的枚举来做到这一点.

您可以使用Suit的类来提供类型安全性,这是Java 5之前的解决方案.Josh Bloch(在Effective Java中,这是Java程序员imho必读的内容)提升了类型安全枚举模式,该模式成为Java 5枚举.它上面有相当数量的样板和人们不倾向于满足的一些极端情况,例如序列化没有调用构造函数,并且确保只有一个实例必须覆盖readResolve()方法.

例如:

public enum CardColour {
  RED,BLACK
}

public enum Suit {
  SPADES(CardColour.BLACK),CLUBS(CardColour.BLACK),HEARTS(CardColour.RED),DIAMONDS(CardColour.RED);

  private final CardColour colour;

  Suit(CardColour colour) { this.colour = colour; }

  public CardColour getColour() { return colour; }
}

编辑:Sun有一个introduction to typesafe enums.

至于接口,它们确实补充了枚举而不是替代.就像你可以说Suit是一个界面,你有这个:

public interface Suit {
  CardColour getColour();
}

问题是你可以去定义300种不同的套装,你也可以多次定义黑桃.枚举的另一个优点是(尽管有类加载极端情况)是每个枚举值只有一个实例.通常,这被称为具有规范值,这意味着此等式成立:

a.equals(b) == b.equals(a) == (a == b)

对于所有a,b,它们是特定枚举的实例.这意味着不是写作:

if (card.getSuit().equals(Suit.SPADES)) { ... }

你可以写:

if (card.getSuit() == Suit.SPADES) { ... }

这更快,通常更容易阅读.如果您正在比较不同类型的枚举,说它们可能不相等,那么IDE通常会给您反馈,这可能是一种有用且早期的错误检查形式.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读