一 枚举类
概述:类的对象的个数是有限个,确定的时候,此类就可以看作是枚举类。当需要定义一组常量时,强烈建议使用枚举类。 如果枚举类的对象只有一个,则枚举类可以看做单例模式的一种实现方式。
1)例子
星期:Monday(星期一)、......、Sunday(星期天)
性别:Man(男)、Woman(女)
季节:Spring(春节)......Winter(冬天)
支付方式:Cash(现金)、WeChatPay(微信)、Alipay(支付宝)、BankCard(银行卡)、CreditCard(信用卡)
就职状态:Busy、Free、Vocation、Dimission
订单状态:Nonpayment(未付款)、Paid(已付款)、Delivered(已发货)、Return(退货)、Checked(已确认)Fulfilled(已配货)
线程状态:创建、就绪、运行、阻塞、死亡
1.1 自定义枚举类
在JDK1.5之前,枚举类没诞生的时候
public class SeasonTest {
// 1.定义私有属性,private final
private final String name;
private final String desc;
// 2.定义私有构造器
public SeasonTest(String name, String desc) {
this.name = name;
this.desc = desc;
}
// 3.创建类对象 public static final
public static final SeasonTest SPRING = new SeasonTest("春天", "春暖花开");
public static final SeasonTest SUMMER = new SeasonTest("夏天", "夏暖花开");
public static final SeasonTest AUTUMN = new SeasonTest("秋天", "秋暖花开");
public static final SeasonTest WINNER = new SeasonTest("冬天", "冬暖花开");
@Override
public String toString() {
return "SeasonTest{" +
"name='" + name + '\'' +
", desc='" + desc + '\'' +
'}';
}
public String getSEASON_NAME(){
return SEASON_NAME;
}
public String getSEASON_DESC(){
return SEASON_DESC;
}
}
1.2 使用enum定义枚举类
创建枚举类的对象,声明放在enum类的首位 声明枚举类的私有属性(private final) 创建私有的构造器
public enum Seanson{
PRING("春天", "春暖花开"),
SUMMER("夏天", "夏暖花开"),
AUTUMN("秋天", "秋暖花开"),
WINNER("冬天", "冬暖花开");
// 枚举类对象的属性
private final String name;
private final String desc;
// 私有构造器
private SeasonTest1(String name, String desc) {
this.name = name;
this.desc = desc;
}
public String getName() {
return name;
}
public String getDesc() {
return desc;
}
}
1.3 java.lang.Enum类中的常用方法
1)values():返回当前枚举类所有对象组成的数组
2)toString():返回枚举类对象的对象名
3)valuesOf(String name):返回指定对象名的枚举类对象,注意,如果找不到对象,则报异常:java.lang.IllegalArgumentException
1.4 实现接口的枚举类
// 枚举类继承的接口
interface Info{
void show();
}
enum Season1 implements Info{
SPRING("春天","春暖花开"){
public void show(){
System.out.println("春天在哪里?");
}
},
SUMMER("夏天","夏日炎炎"){
public void show(){
System.out.println("宁静的夏天");
}
},
AUTUMN("秋天","秋高气爽"){
public void show(){
System.out.println("秋天是用来分手的季节");
}
},
WINTER("冬天","白雪皑皑"){
public void show(){
System.out.println("2002年的第一场雪");
}
};
private final String SEASON_NAME;
private final String SEASON_DESC;
private Season1(String seasonName,String seasonDesc){
this.SEASON_NAME = seasonName;
this.SEASON_DESC = seasonDesc;
}
public String getSEASON_NAME() {
return SEASON_NAME;
}
public String getSEASON_DESC() {
return SEASON_DESC;
}
}
二 注解类
2.1 概述
1)注解(Annotation),也是 Jdk1.5 新增的特性。
2)Annotation 其实就是代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。通过使用 Annotation,程序员可以在不改变原有逻辑的情况下,在源文件中嵌入一些补充信息。
2.2 应用举例
示例一:生成文档相关的注解
- @author 标明开发该类模块的作者,多个作者之间使用,分割
- @version 标明该类模块的版本
- @see 参考转向,也就是相关主题
- @since 从哪个版本开始增加的
示例二:在编译时进行格式检查(JDK内置的三个基本注解)
- @Override:限定重写父类方法, 该注解只能用于方法
- @Deprecated:用于表示所修饰的元素(类, 方法等)已过时。通常是因为所修饰的结构危险或存在更好的选择
- @SuppressWarnings:抑制编译器警告
2.3 元注解
元注解:用于修饰现有注解的注解
五个元注解
- @Retention:用于指定该 Annotation 的生命周期,属性value取值 RetentionPolicy 枚举类对象,SOURCE:编译不保留;CLASS(默认行为):编译保留,运行不保留;RUNTIME:编译保留,运行也保留
- @Target:用于指定被修饰的 Annotation 能用于修饰哪些程序元素。 使用ElementType枚举类对象限定
- @Documented:用于指定被该元 Annotation 修饰的 Annotation 类将被 javadoc 工具提取成文档
- @Inherited:被它修饰的 Annotation 将具有继承性。
- @Repeatable:可以让注解重复作用在目标上(JDK1.8新增)
2.4 自定义注解
1)所有的注解会自动继承 java.lang.annotation.Annotation,并不能继承别的类或是接口
2)参数成员只能用 public 或默认(default)这两个访问权修饰
3)参数成员只能用基本数据类型和 String、Enum、Class、annotations 数据类型,以及这一些类型的数组
4)要获取类方法和字段的注解信息,必须通过Java的反射技术来获取 Annotation对象,除此之外没有别的获取注解对象的方法