java基础笔记-枚举类,注解


八 枚举类&注解

这俩都是JDK5.0加进去的。彼此没啥关系

1.枚举类

啥是枚举啊,一个一个数呗

类的对象个数是有限的,确定个数的,比如星期,性别,季节

当需要定义一组的常量时,强烈建议使用枚举类!!!

1.1 JDK5之前 自定义

class Season{
    //1. 属性都final
    private final String name;

    //2.私有化构造方法
    private Season(String name){
        this.name=name;
    }

    //3.提供枚举的所有对象 ,public提供对外访问,static保证可以直接调用,final防止修改
    public static final Season SPRING=new Season("春天");
    public static final Season SUMMER=new Season("夏天");
    public static final Season AUTUMN=new Season("秋天");
    public static final Season WINTER=new Season("冬天");

    //4.可以提供get方法,可以修改toString方法
}

1.2 JDK5 之后 enum

enum关键字来定义枚举类

enum Season{
    //1.提供枚举的所有对象,对象之间用逗号,结尾用分号
    // public static final Season SPRING=new Season("春天"); 对比,能省的都省掉
     SPRING("春天"),
     SUMMER("夏天"),
     AUTUMN("秋天"),
     WINTER("冬天");
    //2. 属性都final
    private final String name;

    //3.私有化构造方法
    private Season(String name){
        this.name=name;
    }
    
    //4.可以提供get方法
    //一般toString方法不用重写,enum默认父类是java.lang.Enum,这里面重写了,输出是对象名
}

1.3Enum类的方法

Season[] values = Season.values();//所有类的数组

//返回指定名的对象
Season season = Season.valueOf("WINTER");//找不到报异常!

winter.toString();

1.4 enum枚举类使用接口

公共的抽象方法

enum Sex implements Info{
    MAN,
    WOMAN;
    //情况1:实现抽象方法
    @override
    public void show(){sout("sdfsd");}
}
interface Info{
    void show();
}

每个对象单独重写抽象方法

enum Sex implements Info{
    MAN{
        @Override
        public void show() {
            System.out.println("nande");
        }
    },
    WOMAN{
        @Override
        public void show() {
            System.out.println("nude ");
        }
    };
}
interface Info{
    void show();
}

2.注解 Annotation *

JDK5.0时新增

Annotation,其实就是代码中的特殊标记,这些标记会被编译

Test Override version param author

可以认为:框架=注解+反射+设计模式

2.1 常见注解

//生成文档的注解
@author
@version
@see
@date
	//这三个只能用于方法
    @exception
    @return
    @param

//编译时的格式检查
@Override //检查重写的格式对不对
@Deprecated  //标识过时了,但是能用
@SuppressWarnings({"unused","rawtypes"})  //抑制编译器警告

//跟踪代码依赖性,实现代替配置文件的功能
@WebSerlet("/login")
@Transaction(....)

//单元测试
@Test
@After
@Before

2.2 自定义注解

? 一般不用,用现成的多好

如果自定义类没有成员,表明这是一个标识作用

注解有啥用了,配合反射(信息处理流程),读取注解

public @interface MyAnnotation {
    String values() default "hello";//这是个属性
    //类型只能是String,Class ,enum ,Annotation 以及他们的数组类型
}

@MyAnnotation("hhh")
class Person{
    @MyAnnotation
    public void fun(){}
    ...
}

2.3 JDK 4种元注解

修饰其他注解的注解

2.3.1 Retention()

只能所修饰的注解的生命周期

表示一直保留到哪个阶段:

SOURSCE , CLASS(默认) , RUNTIME

如果需要反射调用,则要设置为RUNTIME

@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation{
    ...
}

2.3.2 Target

用于指定被修饰的Annotation能修饰在哪些地方(方法,局部变量,类)

TYPE , FIELD , METHOD , PARAMETER , CONSTRUCTOR , LOCALA_VARIABLE

@Terget(METHOD)

2.3.3 Documented

用于指定被该元注解修饰的Annotation类将被javadoc工具提取成文档,默认情况javadoec是不包括注解的

想要设置@Documented,必须@Tetention(RetentionPolicy.RUNTIME)

最常见的就是@Deprecated 能在文档里看到某些方法是提示过时的

2.3.4 Inherited

被修饰的注解就可以被继承了

说的是class中,子类能继承父类的注解

不是Annotation,注解本身能继承

2.5 J8注解新特性

2.5.1 可重复注解

@MyAnnotation(value="hi")
@MyAnnotation(Value="hh")
public class Person{
    ...
}


@Repeatable(MyAnnotations.class)
@Target({ ... })
@Retention({... })
public @interface MyAnnotation{
    String value;
}
@Target({ ... }) //Target,Retention,Inherited和上面要相同
@Retention({... }) 
public @interface MyAnnotations{
    MyAnnotation[] value;
}

JDK8之前的写法:

@MyAnnotations({@MyAnnotation(value="hi"),@MyAnnotation(Value="hh")})
public class Person{
    ...
}



public @interface MyAnnotations{
    MyAnnotation[] value;
}
public @interface MyAnnotation{
    String value;
}

2.5.2 类型注解 这里写的好像不对。。。慎看

TYPE_PARAMETER

用在Target里面的,表示Target修饰的注解可以写在类型比那辆的声明语句中,、

TYPE_USE

用在Target里面的,表示Target修饰的注解可以写在使用类型的任何语句中

比如泛型,String,基本数据类型,Integer,异常类型

class Person<@MyAnnotation T> throws @MyAnnotation RunTimeException{
    int num=(@MyAnnotation int) 10L;
    ArrayList<>
}

@Target({,TYPE_USE,TYPE_PARAMETER})
public @interface MyAnnotation{
    
}