枚举类与注解

枚举类

枚举类:当类的对象是有限个,并且确定的常量,我们就称此类为枚举类,并且类似class也有属性,jdk1.5新增用enum关键字表示。由于枚举的实例为常量,习惯用大写字母对每个常量命名,并用",“隔开,最后一个以”;"结尾。比如我们开发中表示一周的7天,或者四季,性别等,都是能确定的常量,这就可以用枚举类。

枚举演示

定义一个季节的枚举,具体有春夏秋冬四个季节,代码如下:

/**
 * 季节枚举类
 *
 */
public enum Seaon{
    SPRING("春天","春暖花开"),
    SUMMER("夏天","汗流浃背"),
    Autumn("秋天","硕果累累"),
    WINTER("冬天","雪花漫天");

    private  String name;

    private  String desc;

    Seaon(String name, String desc) {
        this.name = name;
        this.desc = desc;
    }

    public String getName() {
        return name;
    }

    public String getDesc() {
        return desc;
    }
    @Override
    public String toString() {
        return "Seaon{" +
                "name='" + name + '\'' +
                ", desc='" + desc + '\'' +
                '}';
    }
}

这样我们就很容易定义了一个枚举类,而不像jdk5之前去自定义枚举类,通过关键字enum即可。

枚举测试

public class EnumTest {
    public static void main(String[] args) {

        //获取其中的Autumn
        Seaon seaon=Seaon.Autumn;

        //获取Autumn在枚举类中定义的顺序
        int order=seaon.ordinal();
        System.out.println("order:"+order);
        
        //遍历所有枚举值
        for (Seaon season:Seaon.values()) {
            System.out.println(season.toString());
        }
    }
}

打印输出:
在这里插入图片描述
由此看出,枚举用法其实和普通类差不多,只不过用来定义一组常量对象而已。

枚举实现接口

枚举也可以像普通class一样实现接口,比如:

/**
 * 动物枚举
 */
interface  Action{
    void show();
}
//实现Action接口
public enum AnimalEnum implements  Action {

    DOG("汪汪汪"){
        @Override
        public void show() {
            System.out.println("I am  a dog");
        }
    },
    CAT("喵喵喵"){
        @Override
        public void show() {
            System.out.println("I am a cat");
        }
    };
    private String action;

    AnimalEnum(String action) {
        this.action = action;
    }

    public String getAction() {
        return action;
    }

    public void setAction(String action) {
        this.action = action;
    }

    public static void main(String[] args) {
        AnimalEnum animalEnum= AnimalEnum.DOG;
        animalEnum.show();  //I am  a dog
    }
}

由此更进一步证明,枚举类和普通类没啥区别,除开一些少许的限制外,可以把枚举类看作是一个普通类。

注解(Annotation)

jdk5.0开始,Java增加了对元数据(MetaData)的支持,也就是Annotation(注解)。注解就是代码里的特殊标记,这些标记可以在编译,类加载运行时被读取,并执行相应的处理。可以方便我们在不大范围修改代码逻辑的情况下,方便的使用这些数据。Annotation可以像修饰符一样,可修饰包,类,构造器,方法,成员变量,参数,局部变量的声明等。通常用@符合表示,jdk5内置了三种:@Override(限定重写父类的方法),@Deprecated(表示所修饰的方法,类已过时,不建议使用或者有其他替换的方案),@SuppressWarnings(关闭编译器的警告信息)

注解使用示例

注解通常在框架中频繁用到,比如SpringMVC,Servlet,以及SpringBoot中,基于注解开发,替换掉传统的配置文件。

  • SpringMVC中
    在这里插入图片描述
  • SpringBoot
    在这里插入图片描述

自定义注解

  • 定义新的Annotation类型使用@interface关键字
  • 自定义注解自动继承了java.lang.annotation.Annotation接口,Annotation的成员变量在Annotation定
  • 义中以无参方法的形式声明。其方法名和返回值定义了该成员的名字和返回类型,我们称为配置参数。类型只能是8种基本类型、String类型,Class类型、enum类型、Annotation类型、以上所有类型的数组
  • 可以在定义Annotation的成员变量时为其指定初始值,指定成员变量的初始值可使用default关键字
  • 如果只有一个参数成员,建议使用参数名为value
  • 如果定义的注解含有配置参数,那么使用时必须制定参数值,除非它有默认值。格式是"参数名=参数值",如果只有一个参数成员,且名称为value,可以省略"value="
  • 没有成员定义的Annotation称为标记;包含成员变量的Annotation称为元数据Annotation
/**
 * 自定义注解
 */

@Target({TYPE,METHOD,PARAMETER,})
@Retention(RetentionPolicy.RUNTIME)
public @interface XfAnnotation {

    String value();
}

@Target表示注解可以修饰的程序元素;@Retention指定注解的生命周期,比如这里的RetentionPolicy.RUNTIME表示运行时起效

  • 注解使用
@XfAnnotation(value = "xfnihao")  //使用
public class Student{

    private int id;
    private  String name;

    public Student(int id,String name){
        this.id=id;
        this.name=name;

    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

总结

了解枚举和注解的实现原理,我们知道枚举和普通类除了某些限制条件,其他都比较类似,而注解在框架中比较常见,通常搭配反射使用,才起到流程控制的作用。现在,我们只需暂时了解,并学会自定义某些注解即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值