`
longgangbai
  • 浏览: 7331252 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JDK 的 枚举的经典使用

阅读更多
Enum作为Sun全新引进的一个要害字,看起来很象是非凡的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。 当我们在声明一个enum类型时,我们应该注重到enum类型有如下的一些特征。

  1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。

  2.所有枚举值都是public , static , final的。注重这一点只是针对于枚举值,我们可以和在普通类里面定义 变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。

  3.Enum默认实现了java.lang.Comparable接口。

  4.Enum覆载了了toString方法,因此我们假如调用Color.Blue.toString()默认返回字符串”Blue”.

  5.Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue.因此我们在自己重写toString方法的时候就要注重到这一点,一把来说应该相对应地重写valueOf方法。

  6.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。

  7.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定,这里Color.Red.ordinal()返回0。

  了解了这些基本特性,我们来看看如何使用它们。

  1.遍历所有有枚举值. 知道了有values方法,我们可以轻车熟路地用ForEach循环来遍历了枚举值了。

  for (Color c: Color.values())
  System.out.println(“find value:” c);

  2.在enum中定义方法和变量,比如我们可以为Color增加一个方法随机返回一个颜色。

  public enum Color {
  Red,
  Green,
  Blue;

  /*
  *定义一个变量表示枚举值的数目。
  *(我有点希奇为什么sun没有给enum直接提供一个size方法).
  */
  private static int number = Color.values().length ;

  /**
  * 随机返回一个枚举值
  @return a random enum value.
  */
  public static Color getRandomColor(){
  long random = System.currentTimeMillis() % number;
  switch ((int) random){
   case 0:
    return Color.Red;
   case 1:
    return Color.Green;
   case 2:
    return Color.Blue;
   default : return Color.Red;
  }
  }
  }

  可以看出这在枚举类型里定义变量和方法和在普通类里面定义方法和变量没有什么区别。唯一要注重的只是变量和方法定义必须放在所有枚举值定义的后面,否则编译器会给出一个错误。

  3.覆载(Override)toString, valueOf方法

  前面我们已经知道enum提供了toString,valueOf等方法,很多时候我们都需要覆载默认的toString方法,那么对于enum我们怎么做呢。其实这和覆载一个普通class的toString方法没有什么区别。

  ….
  public String toString(){
  switch (this){
  case Red:
   return "Color.Red";
  case Green:
   return "Color.Green";
  case Blue:
   return "Color.Blue";
  default:
   return "Unknow Color";
  }
  }
  ….
  这时我们可以看到,此时再用前面的遍历代码打印出来的是

  Color.Red
  Color.Green
  Color.Blue

  而不是

  Red
  Green
  Blue.

  可以看到toString确实是被覆载了。一般来说在覆载toString的时候我们同时也应该覆载valueOf方法,以保持它们相互的一致性。

  4.使用构造函数

  虽然enum不可以有public的构造函数,但是我们还是可以定义private的构造函数,在enum内部使用。还是用Color这个例子。

  public enum Color {
  Red("This is Red"),
  Green("This is Green"),
  Blue("This is Blue");

  private String desc;

  Color(String desc){
  this.desc = desc;
  }

  public String getDesc(){
  return this.desc;
  }

  }

  这里我们为每一个颜色提供了一个说明信息, 然后定义了一个构造函数接受这个说明信息。

  要注重这里构造函数不能为public或者protected, 从而保证构造函数只能在内部使用,客户代码不能new一个枚举值的实例出来。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。

  5.实现特定的接口

  我们已经知道enum可以定义变量和方法,它要实现一个接口也和普通class实现一个接口一样,这里就不作示例了。

  6.定义枚举值自己的方法。

  前面我们看到可以为enum定义一些方法,其实我们甚至可以为每一个枚举值定义方法。这样,我们前面覆载 toString的例子可以被改写成这样。

  public enum Color {
  Red {
  public String toString(){
   return "Color.Red";
  }
  },
  Green {
  public String toString(){
   return "Color.Green";
  }
  },
  Blue{
  public String toString(){
   return "Color.Blue";
  }
  };
  }

  从逻辑上来说这样比原先提供一个“全局“的toString方法要清楚一些。

  总的来说,enum作为一个全新定义的类型,是希望能够帮助程序员写出的代码更加简单易懂,个人觉得一般也不需要过多的使用enum的一些高级特性,否则就和简单易懂的初衷想违反了
分享到:
评论

相关推荐

    第17章 JDK 1.5以上版本的新功能──枚举

    JAVA 从入门到精通 第17章 JDK 1.5以上版本的新功能──枚举.ppt

    JDK5.0新特性(3)——枚举

    这篇博客将深入探讨JDK 5.0中的枚举类型,并结合“TestReflect”这个测试文件,来了解如何利用反射API来操作枚举。 首先,枚举在Java 5之前,我们通常使用常量类来模拟枚举,但这种方式存在诸多问题,如容易导致...

    JDK5.0新特性 常量 、枚举、 for each、反射

    在JDK 5.0之前,我们通常使用final关键字来创建不可变的变量,但这样的变量并非真正的常量。JDK 5.0引入了注解(Annotation),允许开发者在源代码中添加元数据,这其中包括了`@Deprecated`和`@Override`等预定义...

    MLDn学习笔记 —— JDK新特性(枚举)

    在Java编程语言中,JDK的新特性之一是枚举(Enum)。枚举是一种特殊的类,它提供了一种安全的方式来表示一组固定数量的常量。在本文中,我们将深入探讨枚举类型及其在JDK中的应用。 一、枚举的定义与使用 1. 基本...

    java jdk经典实例

    Java JDK经典实例是Java初学者不可或缺的学习资源,它包含了169个精心挑选的案例,覆盖了JDK中的大部分功能和细节。通过这些实例,学习者可以深入理解Java语言的核心特性,提升编程技能。以下是对这些知识点的详细...

    JDK5.0新特性 反射、枚举.rar

    `JDK5.0新特性(3)——枚举.doc`中应该会介绍如何声明枚举、枚举实例的创建、枚举的继承、枚举常量的方法以及枚举与switch语句的结合。枚举在设计模式、API设计以及表示固定集合的常量等方面都有重要作用。 再者,...

    2022年掌握JDK1.5枚举类型Java教程.docx

    Java中的枚举类型(Enum)是在JDK 1.5版本中引入的一种特殊的类类型,它的设计目的是为了更好地管理和使用一组固定的常量。枚举在Java中提供了比传统的final常量更安全、更灵活的机制。以下是关于Java枚举类型的一些...

    旧版本JDK JDK1.4

    **Java Development Kit (JDK) 1.4:历史、特性与重要性** JDK(Java Development Kit)是Oracle公司发布的用于...尽管现在可能很少有人直接使用这个版本,但了解其特性对于深入学习Java技术和历史背景是很有价值的。

    JDK1.8手册,中文

    在枚举类中,JDK 1.8也支持了默认方法,这使得枚举常量集可以拥有统一的行为,而无需为每个常量单独实现。 总的来说,JDK 1.8手册是深入理解这些关键特性的宝贵资源,无论是初学者还是经验丰富的开发者,都能从中...

    java中枚举的使用

    枚举在Java中的使用不仅提高了代码的可读性和可维护性,还避免了传统常量类的一些潜在问题,如类型安全和非法实例化。 首先,我们来看枚举的基本定义。枚举类型的声明类似于类的声明,但用关键字`enum`开头。例如:...

    jdk8中文说明文档_CHM.zip jdk1.8文档 jdk1.8说明文档

    7. **新的枚举方法**:`enum`类现在可以有方法,这增加了枚举类型的灵活性,比如`switch`语句可以使用`default`分支处理未明确列出的枚举值。 8. ** Nashorn JavaScript引擎**:Java 8集成了Nashorn JavaScript引擎...

    JDK 5.0.zip

    1. **类型安全的枚举(Enums)**:JDK 5.0引入了枚举类型,使得枚举成为一种独立的、类型安全的类。枚举可以包含方法和常量,增加了代码的可读性和安全性,避免了传统常量类可能导致的问题。 2. **泛型(Generics)...

    JDK1.5.0经典教程

    【JDK1.5.0经典教程】 JDK1.5.0,也称为Java Development Kit的第5个主要版本,是Java编程语言的重要里程碑。这个版本引入了许多新特性和改进,极大地增强了Java的可读性、效率和功能。本教程旨在详细解释JDK1.5.0...

    linux系统jdk1.5下载

    JDK1.5引入了一些重要的特性,如增强的for循环(foreach)、匿名内部类的改进、枚举类型以及泛型的初步支持。这些特性对Java编程产生了深远影响,提升了代码的可读性和安全性。 然而,由于JDK1.5已不再受官方支持,...

    包含 jdk1.5免安装、jdk1.6免安装、jdk1.8(32和64)

    这个压缩包包含了三个不同版本的JDK:JDK 1.5、JDK 1.6和JDK 1.8,其中1.5和1.6是早期版本,而1.8是最流行且广泛使用的版本之一。 **JDK 1.5(也称为Java 5.0)** JDK 1.5在2004年发布,引入了许多重要的新特性,如...

    JDK1.5中文帮助文档

    这个中文帮助文档详细阐述了这些特性的使用方法、语法以及最佳实践,对于学习和使用JDK 1.5的开发者来说,是一份宝贵的参考资料。通过阅读和理解这份文档,开发者能够更好地利用JDK 1.5的特性,编写出更加高效、安全...

    JDK1.4 JDK1.5

    而JDK1.5,也被称为Java SE 5.0,发布于2004年9月,带来了更多重大的变化,例如泛型(Generics)、枚举类型(Enums)、可变参数(Varargs)等,这些特性极大地增强了Java语言的灵活性和可用性。 ### 在操作系统中...

    jdk8和jdk17安装套件

    2. **方法引用和构造器引用**:与lambda表达式配合使用,提供了更简洁的代码语法。 3. **流API(Stream API)**:用于处理集合的数据结构,支持序列化操作,可以进行并行处理,提高程序性能。 4. **默认方法**:在...

    Jdk11中文帮助文档

    **Jdk11中文帮助文档**是Java开发者在学习和使用Spring框架时的重要参考资料,它提供了JDK 11版本的全面API文档,包括类、接口、枚举、注解等详细信息。JDK(Java Development Kit)是Oracle公司发布的Java编程语言...

    枚举类型的说明 enum

    枚举类型是 JDK 5.0 的新特征,Sun 引进了一个全新的关键字 enum 来定义一个枚举类。枚举类型是一种特殊的类,实际上 enum 声明定义的类型就是一个类,这些类都是类库中 Enum 类的子类(java.lang.Enum)。它们继承...

Global site tag (gtag.js) - Google Analytics