欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java学习-关于枚举、注解的笔记整理

程序员文章站 2024-03-08 16:46:40
...

枚举与注解

枚举

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

一年四季:春、夏、秋、冬
发生错误的级别:低、中、高、紧急

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

	定义格式:
  		权限修饰符 enum 枚举名称{
	    	实例1,实例2,实例3}

示例

//错误级别
public enum Level{
 LOW(10),MEDIUM(30),HIGH(60),URGENT(100);
	private int levelvalue;
	
	private Level(int levelvalue){
	this.levelvalue=levelvalue;
	}
public int getLevelvalue(){
  return levelvalue;
}
}

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

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

上述的方法中仅有toString(),可以让我们重写。

上述方法使用示例

// 枚举类Level
 public enum Level{
        LOW(10),MEDIUM(30),HIGH(60);
        private int levelvalue;

        private Level(int levelvalue){
            this.levelvalue=levelvalue;
        }
        public int getLevelvalue(){
            return levelvalue;
        }
    }
// 枚举类Level2
public enum Level2 {
    LOW,MEDIUM,HIGH;
}
//各方法使用示例
public class Demo1 {
    public static void main(String[] args) {
        System.out.println("获取Level中LOW的数值:"+Level.LOW.getLevelvalue());
        System.out.println("\nLOW与HIGH比较:"+Level2.LOW.compareTo(Level2.HIGH));
        System.out.println("LOW与MEDIUM比较:"+Level2.LOW.compareTo(Level2.MEDIUM));
        /**name()和String()区别
         * name()方法是最终的,因此不能被覆盖
         * toString()方法是可以被覆盖的,即重写
         * 相同点:两者的返回值相同*/
        System.out.println("\nname()方法:"+Level.LOW.name()); //打印常量的名称
        System.out.println("toString()方法:"+Level.LOW.toString()); //打印常量的名称
        System.out.println("\n枚举常量的序数:"+Level.LOW.ordinal());//初始常量为零

        Level E = Enum.valueOf(Level.class,"HIGH");
        System.out.println("\n返回带指定名称的指定枚举类型的枚举常量:"+E.name());

    }
    public static void test(Level level){
        switch(level){
            case  LOW:break;
            case  HIGH:break;
        }
    }
}

运行结果:
Java学习-关于枚举、注解的笔记整理

实现接口的枚举类

所有的枚举都继承自java.lang.Enum类。Java不支持多继承,所以枚举对象不能再继承其他类。
每个枚举对象,都可以实现自己的抽象方法。

示例

// 枚举类Level2
public enum Level2 implements LevelShow{
    LOW{
        @Override
        public void show(){
            System.out.println("低级别");
        }
    },MEDIUM {
        @Override
        public void show() {
            System.out.println("中级别");
        }
    },HIGH{
        @Override
        public void show() {
            System.out.println("高级别");
        }
    }
}
interface LevelShow{
    void show();
    }
// 实现接口的枚举类
public class Demo2 {
        public static void main(String[] args) {
            Level2.LOW.show();
            Level2.HIGH.show();

        }
        public static void test(Level level){
            switch(level){
                case  LOW:break;
                case  HIGH:break;
            }
        }
    }

实现接口的枚举类,可以给它的每一个对象添加独特对于接口方法的实现。

运行结果:Java学习-关于枚举、注解的笔记整理
注意事项

  • 定义枚举后,最好不要修改里面的值,除非修改是必要的
  • 枚举值默认继承的是java.lang.Enum类而不是Object类
  • 枚举类不能有子类,因为其枚举类默认被final修饰
  • 只能有private构造方法,不允许外部再去创造它
  • switch中使用枚举时,直接使用常量名,不用携带类名
  • 不能定义name属性,因为自带name属性
  • 不要为枚举类中的属性提供set方法,不符合枚举最初设计初衷。

注解

Java注解(Annotation)又称为Java标注,是JDK5引入的一种注释机制。
Java语言中的类、方法、变量、参数和包等都可以被标注。
注解和注释不同,Java标注可以通过反射获取标注内容。在编译器生成类文件时,标注可以被嵌入到字节码中。
JVM可以保留标注内容,在运行时可以获取到标注内容。
也支持自定义Java标注。

注解是可以运行到代码执行时的注释机制,也可简单理解为向JVM或人展示的一种注释。
一般常用的注释仅限于给人看,JVM是无法看到的。

主要用于

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

内置注解

  • @Override : 重写 *
    定义在java.lang.Override
public class Demo3 {
    //重写
    @Override
    public String toString(){
        return super.toString();
    }
}
  • @Deprecated:废弃 *
    定义在java.lang.Deprecated
public class Demo3{
    public static void main(String[] args) {
         Person p = new Person();
         /**
         * p.setAge(18);
         * 废弃注解不建议使用*/
         p.setAge2(19);

    }
static class Person {
    private int age;

    public int getAge() {
        return age;
    }

/*此方法已被废弃,可通过setAge2进行操作*/
@Deprecated
    public void setAge(int age) {
        this.age = age;
    }
    public void setAge2(int age){
    if (age<0 || age>150){
        throw new RuntimeException("age不合理")
    }this.age=age;
    }
}
}

废弃效果:
Java学习-关于枚举、注解的笔记整理

  • @SafeVarargs
    Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告。
  • @FunctionalInterface: 函数式接口 *
    Java 8 开始支持,标识一个匿名函数或函数式接口。
    Java学习-关于枚举、注解的笔记整理
  • @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 抑制子类没有按最优方法访问内部类的警告
unchecked 抑制没有进行类型检查操作的警告
unqualified-field-access 抑制没有权限访问的域的警告
unused 抑制没被使用过的代码的警告
相关标签: 整理 java