枚举类创建原理【精】
枚举类创建原理【精】
一、前言
枚举类一般应用在需要定义一组常量,该常量在业务中一般用作描述业务的不同状态场景。
二、枚举类定义
1、枚举类的作用
获取个数固定的一组常量中的某个常量。
2、什么情况下使用枚举类
定义一组常量时,且常量个数是固定的,建议使用枚举类获取常量。
3、使用枚举类获取常量的优点
* 枚举类的构造器是私有的,因此其他类不能再创建类对象保证了类对象常量个数是固定的。
*类型安全:调用枚举类只能传递一个定义好的对象名称,传入一个没有定义的名称将会报错。
三、枚举类创建
枚举类是在java5.0版本添加的功能,之前没有枚举类。
使用两种方式创建枚举类,将第一种自定义枚举类演变为官方提供的enum枚举类,推导出java官方enum枚举类的原理。
- 自定义枚举类
  
   - 
    
     
    
    
     
      //自定义枚举类
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
     
      public class EnumTest {
     
    
- 
    
     
    
    
         //1、申明 EnumTest 对象的属性
     
    
- 
    
     
    
    
         private final String name;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
         //2、私有化类的构造器
     
    
- 
    
     
    
    
         private EnumTest(String name) {
     
    
- 
    
     
    
    
             this.name = name;
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
         //3、创建枚举类的对象
     
    
- 
    
     
    
    
         public static final EnumTest SPRING = new EnumTest("春天");
     
    
- 
    
     
    
    
         public static final EnumTest SUMMER = new EnumTest("夏天");
     
    
- 
    
     
    
    
         public static final EnumTest AUTUMN = new EnumTest("秋天");
     
    
- 
    
     
    
    
         public static final EnumTest WINTER = new EnumTest("冬天");
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
         //4、获取枚举类对象的属性
     
    
- 
    
     
    
    
         public String getName() {
     
    
- 
    
     
    
    
             return name;
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
         //5、提供toString
     
    
- 
    
     
    
    
         @Override
     
    
- 
    
     
    
    
         public String toString() {
     
    
- 
    
     
    
    
             return "EnumTest{" +
     
    
- 
    
     
    
    
                     "name='" + name + '\'' +
     
    
- 
    
     
    
    
                     '}';
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
     
      }
     
    
 - enum枚举类
通过观察下面这个通过 enum 创建的 枚举类实例 总结官方提供的枚举类和自定义枚举类区别:
enum 关键字创建枚举类原理:
* 1.使用enum 枚举类创建对象将重复的代码进行了简化,只保留了对象名称 。简化效果如下。
* 简化前:public static final EnumTest SPRING = new EnumTest("春天");
* 简化后:SPRING("春天"),
*
* 2.多个对象之间用逗号 分割,最后用 分号结束。
* SPRING("春天"),
* SUMMER("夏天"),
* AUTUMN("秋天"),
* WINTER("冬天");*
* 3.枚举类默认继承java.lang.Enum,而不是继承Object类。
* 例如:public enum EnumPass 类 编译后是这样的 public final class EnumPass extends Enum
*
* 4. java.lang.Enum默认重写了toString方法,因此在枚举类中可以不写toString方法。自定义的
* 枚举类继承Objec,所以需要重写toString方法。
  
   - 
    
     
    
    
     
      public enum EnumPass {
     
    
- 
    
     
    
    
         /**
     
    
- 
    
     
    
    
     
       * enum 关键字创建枚举类原理:
     
    
- 
    
     
    
    
     
       * 1.使用enum 枚举类创建对象将重复的代码进行了简化,简化效果如下。
     
    
- 
    
     
    
    
     
       * 简化前:public static final EnumTest SPRING = new EnumTest("春天");
     
    
- 
    
     
    
    
     
       * 简化后:SPRING("春天"),
     
    
- 
    
     
    
    
     
       *
     
    
- 
    
     
    
    
     
       * 2.多个对象之间用逗号 分割,最后用 分号结束
     
    
- 
    
     
    
    
     
       * 
     
    
- 
    
     
    
    
     
       * 3.枚举类默认继承java.lang.Enum,而不是继承Object类。
     
    
- 
    
     
    
    
     
       * 例如:public enum EnumPass 类 编译后是这样的 public final class EnumPass extends Enum
     
    
- 
    
     
    
    
     
       *
     
    
- 
    
     
    
    
     
       * 4. java.lang.Enum默认重写了toString方法,因此在枚举类中可以不写toString方法。自定义的
     
    
- 
    
     
    
    
     
       * 枚举类继承Objec,所以需要重写toString方法。
     
    
- 
    
     
    
    
     
       */
     
    
- 
    
     
    
    
     
          SPRING("春天"),
     
    
- 
    
     
    
    
     
          SUMMER("夏天"),
     
    
- 
    
     
    
    
     
          AUTUMN("秋天"),
     
    
- 
    
     
    
    
     
          WINTER("冬天");
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
         //2、申明 EnumTest 对象的属性
     
    
- 
    
     
    
    
         private final String name;
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
         //3、提供有参构造器
     
    
- 
    
     
    
    
     
          EnumPass(String name) {
     
    
- 
    
     
    
    
             this.name = name;
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
         //4、获取枚举类对象的属性
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
         public String getName() {
     
    
- 
    
     
    
    
             return name;
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
     
      }
     
    
 四、调用枚举类
  
   - 
    
     
    
    
     
      public class App {
     
    
- 
    
     
    
    
         public static void main(String[] args) {
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
             //第一种方式,自定义枚举类
     
    
- 
    
     
    
    
             EnumTest spring = EnumTest.SPRING;
     
    
- 
    
     
    
    
     
              System.out.println("自定义枚举类:"+spring);
     
    
- 
    
     
    
    
      
     
    
- 
    
     
    
    
             //第二种方式,enum关键类创建枚举类
     
    
- 
    
     
    
    
             EnumPass spring1 = EnumPass.SPRING;
     
    
- 
    
     
    
    
     
              System.out.println("enum创建枚举类:" +spring1.getName());
     
    
- 
    
     
    
    
     
          }
     
    
- 
    
     
    
    
     
      }
     
    
 测试结果
  
   - 
    
     
    
    
     
      自定义枚举类:EnumTest{name='春天'}
     
    
- 
    
     
    
    
     
      enum创建枚举类:春天
     
    
 
文章来源: brucelong.blog.csdn.net,作者:Bruce小鬼,版权归原作者所有,如需转载,请联系作者。
原文链接:brucelong.blog.csdn.net/article/details/104892003
- 点赞
- 收藏
- 关注作者
 
             
           
评论(0)