Java 枚举

简介: Java 枚举

定义

Java 枚举是一个特殊的类,一般表示一组常量。

Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。

例如定义一个星期的枚举类。

enum Week 
{ 
    SUNDAY, MONDAY, TUESDAY,WEDNUESDAY,FRIDAY,SATURDAY; 
} 

public class Test
{
    // 执行输出结果
    public static void main(String[] args)
    {
        Week w1 = Week.SUNDAY;
        System.out.println("today is " w1);
    }
}

特点

  • 使用关键字enum
  • 类型名称
  • 枚举可以单独定义在一个文件。
  • 枚举可以实现一个或多个接口(Interface)
  • 可以定义新的变量

枚举的常用方法

int compareTo(E o)

比较此枚举与指定对象的顺序。 枚举常量只能与相同枚举类型的其他枚举常量进行比较。在该对象小于、等于或大于指定对象时,分别返回负整数、零或正整数。

// Enum 中的源码
public final int compareTo(E o) {
 Enum other = (Enum)o;
 Enum self = this;
 if (self.getClass() != other.getClass() && // optimization
  self.getDeclaringClass() != other.getDeclaringClass())
  throw new ClassCastException();
 return self.ordinal - other.ordinal;
}
String name()

返回实例的名称。

static values()

返回一个包含全部值的数组,可以用来遍历所有值。

String toString()

返回此实例的名称。

// Enum 中 name() 和 toString()
public String toString() {
 return name;
}
public final String name() {
 return name;
}
int ordinal()

返回枚举值的索引值(从0开始),即枚举值在枚举声明中的顺序,这个顺序根据枚举值声明的顺序而定。

<T extends Enum<T>> valueOf()

返回带指定名称的指定枚举类型的枚举常量,名称必须与在此类型中声明枚举常量所用的标识符完全匹配(不允许使用额外的空白字符)。这个方法与toString相对应,因此重写 toString() 方法,一定要重写 valueOf()方法(我们可以重写 toString() 方法,但不能自己重写 valueOf() 方法,当我们重写 toString()方法时,valueOf() 方法会自动重写。)

枚举的应用

用法一:常量

enum Week 
{ 
    SUNDAY, MONDAY, TUESDAY,WEDNUESDAY,FRIDAY,SATURDAY; 
} 

用法二:switch

enum Week 
{ 
    SUNDAY, MONDAY, TUESDAY,WEDNUESDAY,THURSDAY,FRIDAY,SATURDAY; 
} 
public class Test { 
 Week week = Week.SUNDAY; 
 public void change() { 
  switch (week) { 
  case SUNDAY: 
   week  = Week.SUNDAY; 
   break; 
  case MONDAY: 
   week = Week.MONDAY; 
   break; 
  case TUESDAY: 
   week = Week.TUESDAY; 
   break; 
  case WEDNUESDAY: 
   week  = Week.WEDNUESDAY; 
   break; 
   case THURSDAY: 
   week = Week.THURSDAY; 
   break;
  case FRIDAY: 
   week = Week.FRIDAY; 
   break; 
  case SATURDAY: 
   week = Week.SATURDAY; 
   break; 
  } 
 } 
} 

用法三:向枚举中添加新方法

public enum Week { 
 SUNDAY("星期日", 0), MONDAY("星期一", 1), TUESDAY("星期二", 3), WEDNUESDAY("星期三", 4), THURSDAY("星期四", 1), FRIDAY("星期五", 3), SATURDAY("星期六", 4); 
 // 成员变量 
 private String name; 
 private int index; 
 // 构造方法 
 private Week(String name, int index) { 
  this.name = name; 
  this.index = index; 
 } 
 // 普通方法 
 public static String getName(int index) { 
  for (Color c : Color.values()) { 
   if (c.getIndex() == index) { 
    return c.name; 
   } 
  } 
  return null; 
 } 
 // get set 方法 
 public String getName() { 
  return name; 
 } 
 public void setName(String name) { 
  this.name = name; 
 } 
 public int getIndex() { 
  return index; 
 } 
 public void setIndex(int index) { 
  this.index = index; 
 } 
} 

用法四:覆盖枚举的方法

public enum Week {
 SUNDAY("星期日", 0), MONDAY("星期一", 1), TUESDAY("星期二", 3), WEDNUESDAY("星期三", 4), THURSDAY("星期四", 1), FRIDAY("星期五", 3), SATURDAY("星期六", 4); 
  // 成员变量
  private String name;
  private int index;
  // 构造方法
  private Week(String name, int index) {
    thisname = name;
    thisindex = index;
  }
  //覆盖方法
  @Override
  public String toString() {
    return thisindex+"_"+thisname;
  }
}

用法五:实现接口

所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。

public interface Behaviour {
  void print();
  String getInfo();
}
public enum Week implements Behaviour{
   SUNDAY("星期日", 0), MONDAY("星期一", 1), TUESDAY("星期二", 3), WEDNUESDAY("星期三", 4), THURSDAY("星期四", 1), FRIDAY("星期五", 3), SATURDAY("星期六", 4); 
  // 成员变量
  private String name;
  private int index;
  // 构造方法
  private Week(String name, int index) {
    thisname = name;
    thisindex = index;
  }
//接口方法
  @Override
  public String getInfo() {
    return thisname;
  }
  //接口方法
  @Override
  public void print() {
    Systemoutprintln(thisindex+":"+thisname);
  }
}

用法六:使用接口组织枚举

public interface Food {
   enum Coffee implements Food{
     BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
   }
   enum Dessert implements Food{
     FRUIT, CAKE, GELATO
   }
 }
相关文章
|
10天前
|
安全 Java 测试技术
🎉Java零基础:全面解析枚举的强大功能
【10月更文挑战第19天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
96 60
|
2月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
59 9
Java——反射&枚举
|
2月前
|
Java
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
java小工具util系列4:基础工具代码(Msg、PageResult、Response、常量、枚举)
78 5
|
2月前
|
安全 Java 开发者
Java 枚举(enum)详解
Java 中的枚举(`enum`)是一种特殊的数据类型,用于定义一组固定的常量,提升代码的类型安全性和可读性。枚举使用 `enum` 关键字定义,支持方法和构造函数,具有类型安全、单例、自动序列化等特点,并且可以遍历和用于 `switch` 语句中。实际应用包括状态机、指令集、类型标识等场景。枚举使代码更加清晰易维护。
|
6月前
|
安全 Java 程序员
Java语言枚举(Enum)的深入探索
Java语言枚举(Enum)的深入探索
|
3月前
|
Java
Java枚举使用的基本案例
这篇文章是关于Java枚举的基本使用,通过一个指令下发的代码案例,展示了如何定义枚举、使用枚举以及如何通过枚举实现指令的匹配和处理。
|
3月前
|
Java 开发者
在Java编程中,if-else与switch作为核心的条件控制语句,各有千秋。if-else基于条件分支,适用于复杂逻辑;而switch则擅长处理枚举或固定选项列表,提供简洁高效的解决方案
在Java编程中,if-else与switch作为核心的条件控制语句,各有千秋。if-else基于条件分支,适用于复杂逻辑;而switch则擅长处理枚举或固定选项列表,提供简洁高效的解决方案。本文通过技术综述及示例代码,剖析两者在性能上的差异。if-else具有短路特性,但条件增多时JVM会优化提升性能;switch则利用跳转表机制,在处理大量固定选项时表现出色。通过实验对比可见,switch在重复case值处理上通常更快。尽管如此,选择时还需兼顾代码的可读性和维护性。理解这些细节有助于开发者编写出既高效又优雅的Java代码。
47 2
|
3月前
|
安全 Java 编译器
|
4月前
|
存储 缓存 Java
java枚举消除冗余代码问题之findByName和findByValue方法工作时的问题如何解决
java枚举消除冗余代码问题之findByName和findByValue方法工作时的问题如何解决
|
4月前
|
安全 Java
Java进阶之枚举
【7月更文挑战第11天】Java枚举是Java 5引入的特性,用于定义固定常量集合,如星期。枚举是继承自`java.lang.Enum`的特殊类,编译后成为final类,每个枚举值是静态final实例。定义枚举用`enum`关键字,如`public enum Weekday {MONDAY, TUESDAY, ...}`。枚举可包含方法和变量,能实现接口但不能继承其他类。例如,`Weekday`枚举可实现`Describe`接口,提供`describe()`方法。在实际应用中,枚举常用于表示如响应状态等固定选项,便于类型安全和代码阅读。
38 8