枚举

简介: 定义Java 枚举是一个特殊的类,一般表示一组常量。Java 枚举类使用 enum 关键字来定义,各个常量使用逗号 , 来分割。

定义

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
   }
 }



相关文章
|
Android开发
KernelSU基于内核的 SU。它通过自定义内核,直接在内核中赋予目标进程 root 权限。
KernelSU基于内核的 SU。它通过自定义内核,直接在内核中赋予目标进程 root 权限。
4413 0
|
运维 监控 安全
在Linux中,如何进行故障排查?
在Linux中,如何进行故障排查?
|
人工智能 自动驾驶 算法
人工智能伦理:技术发展与道德责任的交汇点
随着人工智能技术的飞速发展,其伦理问题亦成为社会关注的焦点。本文将探讨AI技术在带来便利的同时,所面临的伦理挑战和责任归属问题。通过分析AI在不同领域的应用案例,并结合最新的研究成果和统计数据,文章旨在提供一个全面的视角来审视人工智能的伦理维度,同时呼吁制定更为严格的伦理准则和监管政策,以确保技术的健康发展与社会价值的和谐统一。
|
编解码 文字识别 计算机视觉
寒武纪1号诞生:谢赛宁Yann LeCun团队发布最强开源多模态LLM
【7月更文挑战第10天】【寒武纪1号】- 谢赛宁、Yann LeCun团队发布开源多模态LLM,含8B至34B规模模型,创新空间视觉聚合器(SVA)提升视觉-语言集成,建立新基准CV-Bench及大规模训练数据集Cambrian-7M。在多模态任务中表现出色,尤其在高分辨率图像处理上,但面临高分辨率信息处理和部分视觉任务评估的局限。[链接](https://arxiv.org/pdf/2406.16860)
347 1
|
存储 Java 调度
Java 最常见的面试题:队列和栈是什么?有什么区别?
Java 最常见的面试题:队列和栈是什么?有什么区别?
|
机器学习/深度学习 人工智能 自然语言处理
《零基础实践深度学习》1.4.1飞桨产业级深度学习开源开放平台介绍
这篇文章详细介绍了飞桨(PaddlePaddle)这一产业级深度学习开源开放平台,阐述了其在深度学习领域的广泛应用和重要性,以及飞桨平台的核心框架、开发套件、工具组件和预训练模型等,旨在帮助开发者快速实现AI想法并推动产业智能化升级。
【植物大战僵尸杂交版】致敬传奇游戏玩家——一个普通人的六年坚持
【植物大战僵尸杂交版】致敬传奇游戏玩家——一个普通人的六年坚持
|
人工智能 并行计算 数据可视化
【计算机视觉】手把手教你配置stable-diffusion-webui进行AI绘图(保姆级教程)
如果说,会用各大在线的AI绘图平台来生成图像的话,算是AI绘画的小学生级别。那么,如果会使用本地化部署来运行AI绘画的话,那就已经算得上是高中毕业,进入成年啦。等你能够使用AI绘图指哪打哪,想怎么画怎么画,那就已经是大学毕业,学成归来的牛逼人物啦。
1480 1
|
SQL XML 前端开发
JavaWeb开发 JSP技术详解(一)
JavaWeb开发 JSP技术详解(一)
|
JavaScript 小程序 测试技术
vite环境变量配置
vite环境变量配置
502 0