java语法糖---枚举

         在JDK5.0中提供了大量的语法糖,例如:自动装箱拆箱、增强for循环、枚举、泛型等。所谓“语法糖”就是指提供更便利的语法供程序员使用,只是在编译器上做了手脚,却没有提供对应的指令集来处理它。

         下面要介绍的是枚举这个语法糖的原理。

         其实enum就是一个普通的类,它继承自java.lang.Enum类。

public enum Sex {
         MALE,
         FEMALE
}

 

public final class Sex extends java.lang.Enum{
    public static final Sex MALE;
    public static final Sex FEMALE;
    public static Sex[] values();
    public static Sex valueOf(java.lang.String)
    static {};
}

 

 

         可以看出Sex编译成class文件之后,就变成发一个类,这个类是final的,所以enum是不可以被其他类继承的。由于enum已经继承了java.lang.Enum,所以enum不能再继承其他类。其中,enum中的每个枚举实例都是它自己的一个常量实例。除了这些,编译器还为我们生成了一个values方法。

         下面再用DJ把这个enum的class文件反编译,看一下每个方法里面都做了些什么东西。

public final class Sex extends Enum
{
 
    public static Sex[] values()
    {
        return (Sex[])$VALUES.clone();
    }
 
    public static Sex valueOf(String s)
    {
        return (Sex)Enum.valueOf(Sex, s);
    }
 
    private Sex(String s, int i)
    {
        super(s, i);
    }
 
    public static final Sex MALE;
    public static final Sex FEMALE;
    private static final Sex $VALUES[];
 
    static
    {
        MALE = new Sex("MALE", 0);
        FEMALE = new Sex("FEMALE", 1);
        $VALUES = (new Sex[] {
            MALE, FEMALE
        });
    }
}

 

 

         在static块中初始化了两个enum实例,Sex枚举的构造方法有两个参数,第一个参数是枚举实例的名字,第二个参数是序列号(用ordinal方法可以获取到)。

 

         我们还可以向每个枚举实例添加方法。

public enum Sex {
         MALE {
                   public String toString() {
                            return "我是男人";
                   }
         },
         FEMALE {
                   public String toString() {
                            return "我是女人";
                   }
         };
}

 

 

         那这种情况下,编译器又为我们做了些什么动作呢?编译这个文件之后,我们可以看到生成了三个class文件,分别是Sex.class、Sex$1.class、Sex$2.class。它们分别是些什么东东,别急,我们用“神器”DJ打开这些文件来看一下。

public class Sex extends Enum
{
 
    public static Sex[] values()
    {
        return (Sex[])$VALUES.clone();
    }
 
    public static Sex valueOf(String s)
    {
        return (Sex)Enum.valueOf(Sex, s);
    }
 
    private Sex(String s, int i)
    {
        super(s, i);
    }
 
    public static void main(String args[])
    {
    }
 
 
    public static final Sex MALE;
    public static final Sex FEMALE;
    private static final Sex $VALUES[];
 
    static
    {
        MALE = new Sex("MALE", 0) {
 
            public String toString()
            {
                return "\u6211\u662F\u7537\u4EBA";
            }
 
        }
;
        FEMALE = new Sex("FEMALE", 1) {
 
            public String toString()
            {
                return "\u6211\u662F\u5973\u4EBA";
            }
 
        }
;
        $VALUES = (new Sex[] {
            MALE, FEMALE
        });
    }
}
 

 

 

         跟上面生成的class文件差不多,只是在static块中两个枚举实例的初始化变成了匿名内部类(这也就是为什么会多了两个class文件的原因了,^_^),在每个匿名内部类都有一个toString方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 枚是一种特殊的数据类型,它可以定义一组常量,这些常量在程序中是固定不变的。枚常量可以用于代表一些特定的状态或类型,比如星期几、颜色、性别等。在Java中,枚类型是通过关键字enum来定义的。枚类型的常量可以通过枚类型名和常量名来访问,例如:Weekday.MONDAY。枚类型还可以定义方法和构造函数,以便更好地描述枚常量的特性和行为。枚类型在Java中广泛应用于各种场景,例如状态机、配置管理、错误码等。 ### 回答2: 枚(Enumeration)在Java中是一种特殊的数据类型,它是一组有限且已命名的数据项的集合。枚类型属于引用数据类型,它的每一个成员都是一个常量对象,且不能改变,可以看作一个常量的集合。 枚类型的定义格式如下: enum 枚类型名称{ 枚值1, 枚值2, …… 枚值N; } 其中,枚常量就是指定义在枚类型中的数据项,每个枚常量都有一个唯一的名称,并且是用常量大写字母来表示的。我们可以使用枚类型定义变量,枚类型变量赋值的时候只能取枚类型中的某一个值,不能赋值其他类型的值。 枚类型的最大优点就在于其具备范围固定、安全性高、易于理解的特点。在处理程序中,为了避免输入的数据不符合要求或程序出现异常,我们经常要用到对数据的限制。而对于枚类型,系统会自动限定它的取值,程序员不需要额外考虑对值的判断,因此大大简化代码,提高程序的可读性、可维护性。 在Java程序的开发中,枚类型经常被用在菜单项、操作类型、状态码等等的定义中。比如一个操作系统的文件操作类型就可以定义为枚类型,包括新建、打开、复制、粘贴、剪切等操作,这样就方便了后续的程序设计。 总之,枚类型在Java程序设计中已经被广泛应用,在一些常量的定义、一些有限值数据类型的定义上使用枚类型能够方便代码的编写,提高程序的可读性并减少程序出错的可能。 ### 回答3: 枚Java中一种特殊的类,它可以用来定义一组固定的值,枚成员就是这组固定的值。例如,我们可以定义一个枚类来表示一周中的每一天: ``` public enum DayOfWeek { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; } ``` 在定义枚类时,每个枚成员都是一个对象,它们都是该枚类的实例。枚成员的值默认为它们在枚类中的位置,可以通过枚成员的ordinal()方法获取。 枚类中可以定义成员变量、构造方法、普通方法和静态方法。枚成员作为对象,可以调用枚类中的成员方法。 枚还可以用在switch语句中,例如: ``` DayOfWeek day = DayOfWeek.MONDAY; switch (day) { case MONDAY: System.out.println("Today is Monday."); break; case TUESDAY: System.out.println("Today is Tuesday."); break; case WEDNESDAY: System.out.println("Today is Wednesday."); break; case THURSDAY: System.out.println("Today is Thursday."); break; case FRIDAY: System.out.println("Today is Friday."); break; case SATURDAY: System.out.println("Today is Saturday."); break; case SUNDAY: System.out.println("Today is Sunday."); break; } ``` 以上代码输出的结果是“Today is Monday.”。 枚的好处是使代码更容易理解和维护,因为它将具有相同含义的常量组织在一起,而且可以避免使用数字表示常量,增加代码的可读性。另外,枚还可以提供类型安全检查,避免类型错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值