枚举和注解
1.枚举
1.枚举概述
在某些情况下, 一个类的对象是有限且固定的。如季节类、月份类等, 可以采用枚举类
手动实现枚举类:
- private修饰构造器
- 属性使用 private final 修饰
- 把该类的所有实例都是用 public static final 来修饰
枚举类和普通类的区别:
- 枚举类的构造器只能使用private访问控制符
- 枚举类的所有实例必须在枚举类中显示列出(,分隔 ;结尾)。
- 列出的实例系统会自动添加 public static final 修饰
- 所有的枚举类都提供了一个 values() 方法, 该方法可以很方便地遍历所有的枚举值
2.使用 enum 定义枚举类
- JDK1.5新增的enmu关键字用于定义枚举类
- 使用 enmu定义的枚举类默认继承了java.lang.Enum类
public class Test {
public static void main(String[] args) {
Season spring = Season.SPRING;
//Season.SPRING,相当于获取一个Season类的对象
spring.showInfo();
Season spring1 = Season.SPRING;
//每次执行Season.SPRING得到的是同一个对象,枚举类中的每个枚举都是单例
System.out.println(spring.equals(spring1));
}
}
enum Season{
SPRING("春天", "春暖花开"),//相当于调用有参的私有构造方法
SUMMER("夏天", "炎炎夏日"),
AUTURM("秋天", "秋高气爽"),
WINTER("冬天", "凛凛寒冬");
private final String name;
private final String desc;
private Season(String name,String desc) {//私有化构造方法
this.name=name;
this.desc=desc;
}
public void showInfo() {
System.out.println(this.name+":"+this.desc);
}
}
3.通过values()遍历枚举
values()方法可以将枚举类转变为一个枚举类型的数组
//遍历枚举
Season[] season = Season.values();
for (Season s : season) {
s.showInfo();
}
4.实现接口的枚举类
- 和普通类一样, 枚举类可以实现一个或多个接口
- 若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式, 可以让每个枚举值分别来实现该方法。
public class Test {
public static void main(String[] args) {
Season.SPRING.test();
}
}
enum Season implements In{
SPRING("春天", "春暖花开"),//相当于调用有参的私有构造方法
private final String name;
private final String desc;
private Season(String name,String desc) {//私有化构造方法
this.name=name;
this.desc=desc;
}
@Override
public void test() {
System.out.println("实现In接口的test方法");
}
}
interface In{
void test();
}
4.枚举类的方法
2.注解
1.Annotation(注解)概述
- 从JDK5.0开始, java增加了对元数据(MetaData)的支持, 也就是Annotation(注释)
- Annotation其实就是代码里的特殊标记, 这些标记可以在编译, 类加载, 运行时被读取, 并执行相应的处理。通过使用Annotation, 程序员可以在不改变原有逻辑的情况下, 在源文件中嵌入一些补充信息。
- Annotation 可以向修饰符一样被使, 可用于修饰包, 类, 构造器, 方法, 成员变量, 参数, 局部变量的声明, 这些信息被保存在Annotation的"name=value"对中。
- Annotation能被用来为程序元素(类, 方法, 成员变量等)设置元数据。
2.基本的Annotation
- 使用Annotation时要在其前面增加@符号, 并把该Annotation档后才能一个修饰符使用。用于修饰它支持的程序元素。
- 三个基本的Annotation:
@OVerride: 限定重写父类方法, 该注释只能用于方法
@Deprecated: 用于表示某个程序元素(类, 方法等)已过时
@SuppressWarnings: 抑制编译器警告。
public class TestAnno {
public static void main(String[] args) {
// new TestB().test1();//弃用过时的方法
new TestB().test2();
@SuppressWarnings("unused")//抑制警告的注解
TestA a = new TestA();
}
}
class TestA{
public void test() {
}
}
class TestB extends TestA{
@Override //重写的注解
public void test() {
// TODO Auto-generated method stub
super.test();
}
@Deprecated //方法已过时的注解,原来的方法被弃用定义一个新的方法的时候
public void test1() {}
public void test2() {}
}
3.自定义Annotation
- 定义新的Annotation类型使用 @interface 关键字
- **定义 Annotation 的成员变量, 以无参数方法的形式来声明。**其方法名和返回值定义了该成员的名字和类型。
- 可以在定义 Annotation 的成员变量时为其指定初始值, 指定成员变量的初始值可使用default关键字
- 没有成员定义的 Annotation 称为标记; 包含成员变量的 Annotation 称为元数据Annotation
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
class TestB extends TestA{
@TestAnno1(id = 100, desc = "帅气的")//采用自定义的注解对属性进行注解
String name;
}
/**
* 自定义注解
* @author chenyao
*/
@Target(ElementType.FIELD) //表示: 这个注解类是给其他类的属性做注解(不能给方法做注解)
@Retention(RetentionPolicy.RUNTIME) //定义注解的生命周期
@Documented //表示注解会被抽取到doc文档中
@interface TestAnno1{ //自定义注解TestAnno1
//没有成员定义的 Annotation 称为标记; 包含成员变量的 Annotation 称为元数据Annotation
public int id() default 0 ; //成员变量在 Annotation 定义中以无参方法的形式id()来声明
public String desc() default "" ; //自定义注解的成员变量desc,类型为String,初始值为""
}