java 枚举常用操作

在JDK1.5 之前,我们定义常量都是: public static fianl.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。

Java代码

  1. public enum Color {
  2. }

JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强。

Java代码

  1. enum Signal {
  2. }
  3. public class TrafficLight {
  4. public void change() {
  5. switch (color) {
  6. case RED:
  7. break;
  8. case YELLOW:
  9. break;
  10. case GREEN:
  11. break;
  12. }
  13. }

如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。

Java代码

  1. public enum Color {
  2. "红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
  3. // 成员变量
  4. private String name;
  5. private int index;
  6. // 构造方法
  7. private Color(String name, int index) {
  8. this.name = name;
  9. this.index = index;
  10. // 普通方法
  11. public static String getName(int index) {
  12. for (Color c : Color.values()) {
  13. if (c.getIndex() == index) {
  14. return c.name;
  15. }
  16. return null;
  17. // get set 方法
  18. public String getName() {
  19. return name;
  20. public void setName(String name) {
  21. this.name = name;
  22. public int getIndex() {
  23. return index;
  24. public void setIndex(int index) {
  25. this.index = index;
  26. }

下面给出一个toString()方法覆盖的例子。

Java代码

  1. public enum Color {
  2. "红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
  3. // 成员变量
  4. private String name;
  5. private int index;
  6. // 构造方法
  7. private Color(String name, int index) {
  8. this.name = name;
  9. this.index = index;
  10. //覆盖方法
  11. @Override
  12. public String toString() {
  13. return this.index+"_"+this.name;
  14. }

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

Java代码

  1. public interface Behaviour {
  2. void print();
  3. }
  4. public enum Color implements Behaviour{
  5. "红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
  6. // 成员变量
  7. private String name;
  8. private int index;
  9. // 构造方法
  10. private Color(String name, int index) {
  11. this.name = name;
  12. this.index = index;
  13. //接口方法
  14. @Override
  15. public String getInfo() {
  16. return this.name;
  17. //接口方法
  18. @Override
  19. public void print() {
  20. this.index+":"+this.name);
  21. }

Java代码 

  • public interface Food {
  • enum Coffee implements Food{
  • }
  • enum Dessert implements Food{
  • }
  • }

java.util.EnumSet和java.util.EnumMap是两个枚举集合。EnumSet保证集合中的元素不重复;EnumMap中的 key是enum类型,而value则可以是任意类型。关于这个两个集合的使用就不在这里赘述,可以参考JDK文档。

关于枚举的实现细节和原理请参考:

参考资料:《ThinkingInJava》第四版

http://softbeta.iteye.com/blog/1185573

我的这篇文章,因为是转载的,可能基本就没有变动,导致被某人踩了一脚。觉得不符合我大师兄的性格。下面我把自己的使用理解给整理一下。

也是因为因为当时刚刚开始学习吧。把平时自以为了解的东西都只是大概了解了一下,说到底,还是自以为了解了,其实转眼就不知道什么是什么了。
出来学习,不习惯看代码怎么能行呢?
下面是我自己的测试代码。

[java] view plain copy

  1. package com.lxk.enumTest;
  2. /**
  3. * Java枚举用法测试
  4. * <p>
  5. * Created by lxk on 2016/12/15
  6. */
  7. public class EnumTest {
  8. public static void main(String[] args) {
  9. forEnum();
  10. useEnumInJava();
  11. }
  12. /**
  13. * 循环枚举,输出ordinal属性;若枚举有内部属性,则也输出。(说的就是我定义的TYPE类型的枚举的typeName属性)
  14. */
  15. private static void forEnum() {
  16. for (SimpleEnum simpleEnum : SimpleEnum.values()) {
  17. System.out.println(simpleEnum + "  ordinal  " + simpleEnum.ordinal());
  18. }
  19. System.out.println("------------------");
  20. for (TYPE type : TYPE.values()) {
  21. System.out.println("type = " + type + "    type.name = " + type.name() + "   typeName = " + type.getTypeName() + "   ordinal = " + type.ordinal());
  22. }
  23. }
  24. /**
  25. * 在Java代码使用枚举
  26. */
  27. private static void useEnumInJava() {
  28. String typeName = "f5";
  29. TYPE type = TYPE.fromTypeName(typeName);
  30. if (TYPE.BALANCE.equals(type)) {
  31. System.out.println("根据字符串获得的枚举类型实例跟枚举常量一致");
  32. } else {
  33. System.out.println("大师兄代码错误");
  34. }
  35. }
  36. /**
  37. * 季节枚举(不带参数的枚举常量)这个是最简单的枚举使用实例
  38. * Ordinal 属性,对应的就是排列顺序,从0开始。
  39. */
  40. private enum SimpleEnum {
  41. SPRING,
  42. SUMMER,
  43. AUTUMN,
  44. WINTER
  45. }
  46. /**
  47. * 常用类型(带参数的枚举常量,这个只是在书上不常见,实际使用还是很多的,看懂这个,使用就不是问题啦。)
  48. */
  49. private enum TYPE {
  50. FIREWALL("firewall"),
  51. SECRET("secretMac"),
  52. BALANCE("f5");
  53. private String typeName;
  54. TYPE(String typeName) {
  55. this.typeName = typeName;
  56. }
  57. /**
  58. * 根据类型的名称,返回类型的枚举实例。
  59. *
  60. * @param typeName 类型名称
  61. */
  62. public static TYPE fromTypeName(String typeName) {
  63. for (TYPE type : TYPE.values()) {
  64. if (type.getTypeName().equals(typeName)) {
  65. return type;
  66. }
  67. }
  68. return null;
  69. }
  70. public String getTypeName() {
  71. return this.typeName;
  72. }
  73. }
  74. }


然后是测试的结果图:

简单的例子,大家基本都用过,看不懂的基本都是第二个例子。可以看到,在第二个例子里面,后面带有参数,其实可以这么理解。

enum这个关键字,可以理解为跟class差不多,这也个单独的类。可以看到,上面的例子里面有属性,有构造方法,有getter,也可以有setter,但是一般都是构造传参数。还有其他自定义方法。那么在这些东西前面的,以逗号隔开的,最后以分号结尾的,这部分叫做,这个枚举的实例。也可以理解为,class
 new
出来的实例对象。这下就好理解了。只是,class,new对象,可以自己随便new,想几个就几个,而这个enum关键字,他就不行,他的实例对象,只能在这个enum里面体现。也就是说,他对应的实例是有限的。这也就是枚举的好处了,限制了某些东西的范围,举个栗子:一年四季,只能有春夏秋冬,你要是字符串表示的话,那就海了去了,但是,要用枚举类型的话,你在enum的大括号里面把所有的选项,全列出来,那么这个季节的属性,对应的值,只能在里面挑。不能有其他的。

我上面的例子,就是根据typeName,你可以从那些例子里面挑选到唯一的一个TYPE类型的枚举实例--TYPE.BALANCE。注意方法

TYPE type = TYPE.fromTypeName(typeName);
这个方法的返回类型就是这个TYPE枚举类型的。
这下就好理解,这个枚举是怎么在工作了吧

再补充一下:

上面那个带参数的枚举类型的实例里面实际上是三个属性,除了我自定义的typeName以外,还有2个是系统自带的。看下面源码的图:

看到这里之后,不知道你能不能理解下面图片内说明的话:下面图片主要说明在使用枚举时,的规范和标准。希望可以在实际开发时候用到

最后补充一点:

也许你知道呢,但是也许你不知道呢?我是真的不知道,测了之后才知道!!!

枚举类型对象之间的值比较,是可以使用==,直接来比较值,是否相等的,不是必须使用equals方法的哟。

时间: 2024-12-14 11:50:04

java 枚举常用操作的相关文章

Java Map常用操作

Java之map使用方法 1 package basic; 2 3 import java.util.HashMap; 4 import java.util.Map; 5 6 //map常用操作 7 public class MapDemo { 8 9 public static void main(String[] args) { 10 // map实例化 11 Map<String, Integer> maps = new HashMap<>(); 12 13 // 添加元素

HDFS Java API 常用操作

package com.luogankun.hadoop.hdfs.api; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.

【转】Java 字符串常用操作(String类)

原文网址:http://www.cnblogs.com/freeabyss/archive/2013/05/15/3187057.html 字符串查找 String提供了两种查找字符串的方法,即indexOf与lastIndexOf方法. 1.indexOf(String s) 该方法用于返回参数字符串s在指定字符串中首次出现的索引位置,当调用字符串的indexOf()方法时,会从当前字符串的开始位置搜索s的位置:如果没有检索到字符串s,该方法返回-1 1 String str ="We are

JAVA枚举操作(获取值,转map集合)

JAVA枚举相对来说比.NET的枚举功能强大,感觉就像是一种简化版的类对象,可以有构造方法,可以重载,可以继承接口等等,但不能继承类,JAVA枚举在实际开发中应用相当频繁,以下几个封装方法在实际开发中可能用到,希望对新手有些帮助. 首先,新建一个枚举接口,为保证所有继承此接口的枚举value及description一致,便于开发使用,枚举统一接口如下. public interface EnumCommon { public int getValue(); public String getDe

java:Cookie(常用操作)

 1.常用操作: package cn.zzsxt.lee.web.cookie; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.h

Java Arrays类对数组的常用操作

1.数据的遍历 public class TestClass { public static void main(String[] args) { /*二维数组,每一维可以不一样*/ int a[][] = new int[][]{{1,2,3},{4,5,6},{8,9,10,7}}; Arrays.sort(a[2]); for(int i=0; i<a.length; i++) { for(int j=0; j<a[i].length; j++) { System.out.println

java 基础学习总结(附带eclipse一些常用操作)

一.this关键字 1.使用this调用本类成员变量和成员函数 2.使用this调用构造函数 二.静态变量static关键字 1.含有static成员变量,成员函数.可以直接使用类名来调用. 2.静态成员变量只有一份. 3.在静态函数当中不能使用this. 4.静态代码块的主要作用是为静态成员变量赋值. 三.继承extend 1.使用继承是为了减少重复代码. 2.使用super调用父类构造函数方法. 3.在子类的构造函数当中,必须调用父类的构造函数.编译器默认加上super(); 4.继承只能继

Java基础之数组--&gt;&gt;数组常用操作

3.2一维数组 3.2.1声明数组 数组类型[] 数组名称: int [] username; 或者 数组类型 数组名称[]; int username[]; 3.2.2初始化一维数组 一维数组初始化有两种格式,一种是先声明再赋值,一种是直接声明并赋值 int [] array = new int[5]; //创建一个整型数组对象,长度为5: int [] array = {1,2,3,4,5}; //创建一个整型数组对象,长度为5,并同时赋值: 用new 运算符来创建数组对象时,必须指定数组大

java中常用的工具类(二)

下面继续分享java中常用的一些工具类,希望给大家带来帮助! 1.FtpUtil Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71