Java高级——枚举、注解与反射

前言

枚举、注解、反射是三个Java中最重要,也是最容易被忽视的三个技术。很多人只知道利用框架机械性地使用它们,但是对原理掌握不扎实,下面一起从根本来理解它们。

一、枚举

1.1 枚举简介

JDK1.5引入了一个新的类型——枚举

在JDK1.5之前,我们定义常量都是:
public static final xxx
很难去管理。

而枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。

枚举:用于定义有限数量的一组同类常量,例如:

  • 错误级别:
    低、中、高、紧急

  • 一年四季:
    春、夏、秋、冬

  • 商品的类型:
    美妆、手机、电脑、男装、女装…

在枚举类型中定义的常量是该枚举类型的实例

1.2 枚举定义格式

在JDK1.5之前, 我们定义一个类型的常量的方式:

//JDK1.5之前描述级别的方式:
public class Level {
   
    private int levelValue;                  //私有属性值
    private Level(int levelValue){
              //封装构造方法,让外部无法直接利用构造方法创建对象
        this.levelValue = levelValue;
    }

    //接下来使用公开静态常量属性的方式,来创建对象
    //用户可以通过类名.常量名获取这些常量,获取的常量就是一个Level类型
    //然后通过.getLevelValue()方法获取它的值
    public static final Level LOW = new Level(1);
    public static final Level MIDDLE = new Level(2);
    public static final Level HIGH = new Level(3);

    public int getLevelValue() {
   
        return levelValue;
    }

    public void setLevelValue(int levelValue) {
   
        this.levelValue = levelValue;
    }
}

以上的方式,显然代码量有点冗余,而且并不好提供一些常量对比方法。

枚举定义方式

权限修饰符 enum 枚举类型名称{
		实例1,实例2,实例3....;
}

例如:

public enum Level {
   
    //描述枚举类型(创建对象)
    LOW(1),
    MIDDLE(2),
    HIGH(3);

    private int levelValue;  //正常私有属性

    private Level2(int levelValue){
     //正常私有构造方法
        this.levelValue = levelValue;
    }

    public int getLevelValue() {
   
        return levelValue;
    }

    public void setLevelValue(int levelValue) {
   
        this.levelValue = levelValue;
    }
}

此时的代码量就比较简洁了,甚至还可以这样:

//不赋值,直接通过名字从字面意义上判断大小
public enum Level {
   
    //描述类型的对象(后面可以跟括号,也可以不跟)
    LOW,MIDDLE,HIGH;
    //无私有属性
    //私有无参构造(可省略)
    //private Level3(){}

}

可以通过字面意思直接判断Level类型的状态,也可以通过自定义的方法来实现比较规则等。

1.3 枚举类的主要方法

Enum抽象类常见方法

Enum是所有Java枚举类型的公共基本类(注意Enum是抽象类),以下是它的常见方法:

返回类型 方法名称 方法说明
int compareTo(E e) 比较此枚举与指定对象的顺序
boolean equals(Object o) 当指定对象等于此枚举类型时,返回true
Class<?> getDeclaringClass() 返回此枚举常量的枚举类型对应的Class对象
String name() 返回此枚举常量的名称,在其枚举声明中对其进行声明
int ordinal() 返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)
String toString() 返回枚举常量的名称,它包含在声明中
static<T extends Enum<T> T> static valueOf(Class<T> enumType, String name) 返回带有指定名称的指定枚举类型的枚举常量

comareTo

以下方枚举为例:

public enum Level3 {
   
    LOW, MIDDLE, HIGH;
}

此方法按照枚举对象定义的顺序来作为比较的依据,与值无关

int a = Level3.LOW.compareTo(Level3.MIDDLE); //a = -1
int b = Level3.LOW.compareTo(Level3.HIGH);   //b = -2
int c = Level3.HIGH.compareTo(Level3.LOW);   //c = 2

valueOf

Level3 level = Enum.valueOf(Level3.class,"LOW");

此时的 level 就是 Level3 的 LOW 对象

1.4 实现接口的枚举类

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

每一个枚举对象,都可以实现自己的抽象方法

示例接口:

public interface LShow{
   
    void show();
}
public enum Level3 implements LShow {
   
    LOW(){
   
        @Override
        public void show() {
   
          
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值