核心类库——枚举、注解与反射

枚举 & 注解 & 反射

一、枚举

在JDK1.5之前,定义常量一般为:public stattic final…,很难管理。

JDK1.5引入了枚举。

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

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

错误等级:低、中、高、急
一年的四季:春、夏、秋、冬
商品的类型:美妆、手机、电脑、男装、女装

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

1.1 定义格式

权限修饰符 enum 枚举名称{
    实例1,实例2,实例3,实例4}

如:

public enum Level{
    LOW(30),MEDIUM(15),HIGH(7),URGENT(1);
    
    private int levelValue;
    
    private Level(int levelValue) { 
        this.levelValue = levelValue; 
    }
    
    public int getLevelValue() {
        return levelValue; 
    } 
}

1.2 主要方法

Enum抽象类常见方法

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

返回类型方法名称方法说明
intcompareTo(E 0)比较此枚举与指定对象的顺序
booleanequals(Object other)当指定对象等于此枚举常量时,返回true
Class<?>getDeclaringClass()返回与此枚举常量的枚举类型相对应的Class对象
Stringname()返回此枚举常量的名称,在其枚举声明中对其进行申明
intordinal()返回枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)
StringtoString()返回枚举常量的名称,它包含在声明中
Static<T extends Enum> Tstatic valueOf(class enumType,String name)返回带指定名称的指定枚举类型的枚举常量

1.3 实现接口的枚举类

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

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

public interface LShow{ 
    void show(); 
}

public enum Level implements LShow{ 
    LOW(30){ 
        @Override 
        public void show(){ 
            //... 
        } 
    }, MEDIUM(15){ 
        @Override 
        public void show(){ 
            //... 
        } 
    },HIGH(7){ 
        @Override 
        public void show(){ 
            //... 
        } 
    },URGENT(1){ 
        @Override 
        public void show(){ 
            //... 
        } 
    };
    
    private int levelValue;
    
    private Level(int levelValue) { 
        this.levelValue = levelValue; 
    }
    
    public int getLevelValue() { 
        return levelValue; 
    } 
}

1.4 注意事项

  • 一旦定义了枚举,最好不要妄图修改里面的值,除非修改是必要的。

  • 枚举类默认继承的是java.lang.Enum类而不是Object类

  • 枚举类不能有子类,因为其枚举类默认被fifinal修饰

  • 只能有private构造方法

  • switch中使用枚举时,直接使用常量名,不用携带类名

  • 不能定义name属性,因为自带name属性

  • 不要为枚举类中的属性提供set方法,不符合枚举最初设计初衷。

二、 注解

Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。

Java 语言中的类、方法、变量、参数和包等都可以被标注。和注释不同,Java 标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。Java 虚拟机可以保留标注内容,在运行时可以获取到标注内容 。 当然它也支持自定义 Java 标注。

  • 主要用于:
    • 编译格式检查
    • 反射中解析
    • 生成帮助文档
    • 跟踪代码依赖

2.1 内置注解

  • @Override : 重写

    • 定义在java.lang.Override
  • @Deprecated:废弃

    • 定义在java.lang.Deprecated
  • @SafeVarargs

    • Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
  • @FunctionalInterface: 函数式接口

    • Java 8 开始支持,标识一个匿名函数或函数式接口。
  • @Repeatable:标识某注解可以在同一个声明上使用多次

    • Java 8 开始支持,标识某注解可以在同一个声明上使用多次
  • SuppressWarnings:抑制编译时的警告信息。

    • 定义在java.lang.SuppressWarnings
    • 三种使用方式
    1. @SuppressWarnings("unchecked") [^ 抑制单类型的警告] 
    2. @SuppressWarnings("unchecked","rawtypes") [^ 抑制多类型的警告] 
    3. @SuppressWarnings("all") [^ 抑制所有类型的警告]
    

    ​ 参数列表:

    关键字用途
    all抑制所有警告
    boxing抑制装箱、拆箱操作时候的警告
    cast抑制映射相关的警告
    dep-ann抑制启用注释的警告
    deprecation抑制过期方法警告
    fallthrough抑制switch中缺失breaks的警告
    finally抑制finally模块没有返回的警告
    hiding抑制相对于隐藏变量的局部变量的警告
    incomplete-switch忽略没有完整的switch语句
    nls忽略非nls格式的字符
    null忽略对null的操作
    rawtypes使用generics时忽略没有指定相应的类型
    restriction抑制禁止使用劝阻或禁止引用的警告
    serial忽略在serializable类中没有声明serialVersionUID变量
    static-access抑制不正确的静态访问方式警告
    synthetic-access抑制子类没有按最优方法访问内部类的警告
    uncheched抑制没有进行类型检查操作的警告
    unqualified-field-access抑制没有权限访问的域的警告
    unused抑制没被使用过的代码的警告

2.2 元注解

元注解是作用在其他注解的注解

类型:

(1)@Retention - 标识这个注解怎么保存,是只在代码中,还是编入class文件中,或者是在运行时可以通过反射访问。

(2)@Documented - 标记这些注解是否包含在用户文档中 javadoc。

(3)@Target - 标记这个注解应该是哪种 Java 成员。

(4)@Inherited - 标记这个注解是自动继承的

  • a. 子类会继承父类使用的注解中被@Inherited修饰的注解
    b. 接口继承关系中,子接口不会继承父接口中的任何注解,不管父接口中使用的注解有没有被@Inherited修饰
    c. 类实现接口时不会继承任何接口中定义的注解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值