Java SE典型的新特性(枚举/注解)

JavaSE新特性

2018/07/31 15:52

枚举


实际上枚举就是一种高级的多例设计模式。

Enum类


虽然JDK1.5提供了enum关键字,但是enum并不是一种新的结构,相反,它只是对一种类型的包装:使用enum关键字定义的枚举类本质上就相当于一个Class定义的类,继承了java.lang.Enum父类。

在Enum 类里面有以下方法:

构造方法

protected Enum(String name, int ordinal)

取得枚举名字:

public final String name()

取得枚举序号:

public final int ordinal()

例:

enum Color {
    RED, GREEN, BLUE
}

public class TestDemo {
    public static void main(String[] args) {
        System.out.println(Color.BLUE.ordinal() + "=" + Color.BLUE.name());
    }
}

所有的枚举类默认继承于Enum类
在枚举操作中还有一个方法可以取得所有枚举数据:values()返回的是一个枚举的对象数组。

例:取得所有枚举数据

enum Color {
    RED, GREEN, BLUE
}

public class TestDemo {
    public static void main(String[] args) {
        for(Color temp : Color.values() {
            System.out.println(temp.ordinal()+"=" + temp.name());
        }
    }
}

enum 与 Enum 区别

enum 是一个关键字,使用enum定义的枚举类本质上就相对于一个类继承了Enum这个抽象类而已。

枚举中定义其他结构

考虑多利设计模式,因此,可以在enum的枚举中定义更多的属性,方法,实现接口。

例:在枚举中定义更多的结构

package www.jason.java.testdemo;

enum Color {
    RED("红色"), GREEN("绿色"), BLUE("蓝色");   // 如果定义有很多内容,枚举对象必须写在第一行
    private String title;
    private Color(String title) {   // 构造方法私有化
        this.title = title
    }

    @Override
    public String toString() {
        return this.title;
    }
}

public class TestDemo {
    public static void main(String[] args) {
        System.out.println(Color.BLUE);
    }
}

枚举还可以实现接口,这样枚举中的每一个对象都变成了接口对象。

例:枚举实现接口

package www.bit.java.testdemo;

interface IColor {
    public String gerColor();
}

enum Color implements IColor {
    RED("红色"), GREEN("绿色"), BLUE("蓝色");   // 如果定义很多内容,枚举对象必须写在第一行

    private String title;

    private Color(String title){    // 构造方法私有化

    }

    @Override
    public String toString() {
        return this.title;
    }

    @Override
    public String getColor() {
        return this.title;
    }
}

public class TestDemo {
    public static void main(String[] args) {
        IColor iColor = Color.BLUE;
        System.out.println(iColor.getColor());
    }
}

枚举应用

枚举的最大特点是只有指定的几个对象可以使用。
枚举本身还支持switch

例switch使用枚举:

package www.jason.java.testdemo;

enum Sex {
    MALE, FEMALE
}

public class TestDemo {
    public static void main(String[] args) {
        switch(Sex.MALE) {
            case MALE :
                System.out.println("男人");
                break;
            case FEMALE :
                System.out.println("女人");
                break;
        }
    }
}

详细了解请看大神分析:
https://blog.csdn.net/javazejian/article/details/71333103

注解(Annotation)

JDK提供的三个内置注解:

  1. @Override
  2. @Deprecated
  3. @SupperssWarnings

准确覆写(@Override)

方法覆写:发生在继承关系之中,子类定义了与父类的方法名称相同,参数列表相同,返回值类型相同称为方法的覆写,被覆写的方法不能够拥有比父类更为严格的访问控制权限。

1、Annotation的前提是需要有代码容器,才可以实现自定义的Annotation。

2、反射取得Annotation信息

在java.lang.reflect.AccessibleObject(java.lang.Class)类中提供有如下与Annotation方法:
    取得全部Annotation:public Annotation[] getAnnotations()
    取得指定的Annotation:public T getAnnotation(Class annotationClass)
    注意:Annotation本身有自己的保存范围,不同的Annotation的返回也不同。
          反射可以取得结构上定义的Annotation,Annotation的设计离不开反射

3、Annotation作用范围

Annotation的作用范围在一个枚举类(java.lang.annotation.RetentionPolicy)中定义:
    SOURCE:在源码中出现的Annotation,会被编译器丢弃(该类型的注解信息只会保留在源码里,源码经过编译后,注解信息会被丢弃,不会保留在编译好的class文件里)
    CLASS:在*.class中出现的Annotation,会被JVM丢弃(该类型的注解信息会保留在源码里和class文件里,在执行的时候不会加载到虚拟机中)
        注意:当注解未定义Retention值时,默认值是CLASS,如Java内置注解,@Override, @Deprecated, @SuppressWarning等
    RUNTIME:在类执行的时候出现的Annotation,注解信息在运行期(JVM)也保留,因此可以通过反射机制读取注解的信息(源码, class文件和执行的时候都有注解的信息),如SpringMVC中的@Controller, @Autowired, @RequestMapping等。

4、自定义Annotation

5、取得某一个具体的Annotation信息,也是Class类中的一个方法

Annotation getAnnotation(注解类.class);
然后可以获取到注解里的属性信息

6、注解的一些特点

元素不能有不确定的值:元素要么具有默认值,要么在使用注解的时候提供元素的值。
注解不支持继承:不能使用关键字extends来继承某个@interface,但注解在编译后,编译器会自动继承java.lang.annotation.Annotation接口,
快捷方式:对于有一个为value的元素,如果该元素是唯一需要赋值的一个元素,那么可以不用写成key=value的语法,而只需在括号内给出value元素所需要的值即可,注意这限定了元素名必须是value

7、Java常用内置注解

@Override           : 用于表明此方法覆盖了父类的方法
@Deprecated         :用于标明已经过时的方法或类
@SuppressWarnings   :用于有选择的关闭编译器对类,方法,成员变量,变量初始化的警告

8、元注解
标注其他注解的注解

详细了解请看大神分析:
https://blog.csdn.net/javazejian/article/details/71860633

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值