枚举类和注解
1、当我们定义一组常量的时候我们强烈建议使用枚举类。
2、枚举类的理解:类的对象有有限个、确定的。
3、 如果枚举类只有一个对象,则可以作为单例模式的一种实现方式
我们知道单例模式的实现方式有懒汉式和饿汉式,但是我们可以这样来实现单例模式(这种就是一种枚举类的思想)
class Singal{
public final static Singal instance=new Singal();
}
只有一个属性并且不可以被修改(常量)
1、定义枚举类(自定义枚举类)
jdk5.0之前。
package com.geng;
public class SeasonTest {
public static void main(String[] args){
String str1=Season.AUTUMN.toString();
String str2=Season.SPRING.toString();
String str3=Season.SUMMER.toString();
String str4=Season.WINTER.toString();
System.out.println(str1+" "+str2+" "+str3+" "+str4);
}
}
class Season{
private final String seasonName;
private final String seasonDesp;
private Season(String seasonName, String seasonDesp) {
this.seasonName = seasonName;
this.seasonDesp = seasonDesp;
}
public final static Season SPRING=new Season("春天","春天真好");
public final static Season SUMMER=new Season("夏天","夏天也好");
public final static Season AUTUMN=new Season("秋天","秋天也行");
public final static Season WINTER=new Season("冬天","冬天很好");
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesp='" + seasonDesp + '\'' +
'}';
}
}
2、使用enum关键字
定义的枚举类默认继承于java.lang.Enum类
package com.geng;
public class SeasonTest {
public static void main(String[] args){
String str1=Season.AUTUMN.toString();
String str2=Season.SPRING.toString();
String str3=Season.SUMMER.toString();
String str4=Season.WINTER.toString();
System.out.println(str1+" "+str2+" "+str3+" "+str4);
}
}
enum Season{
SPRING("春天","春天真好"),
SUMMER("夏天","夏天也好"),
AUTUMN("秋天","秋天也行"),
WINTER("冬天","冬天很好");
private final String seasonName;
private final String seasonDesp;
private Season(String seasonName, String seasonDesp) {
this.seasonName = seasonName;
this.seasonDesp = seasonDesp;
}
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesp='" + seasonDesp + '\'' +
'}';
}
}
java.lang.Enum类
package com.geng;
public class SeasonTest {
public static void main(String[] args){
Season season01=Season.AUTUMN;
System.out.println(season01.toString());
Season[] seasons=Season.values();
for(Season season:seasons){
System.out.println(season.toString());
}
System.out.println(Season.valueOf("WINTER"));
}
}
enum Season{
SPRING("春天","春天真好"),
SUMMER("夏天","夏天也好"),
AUTUMN("秋天","秋天也行"),
WINTER("冬天","冬天很好");
private final String seasonName;
private final String seasonDesp;
private Season(String seasonName, String seasonDesp) {
this.seasonName = seasonName;
this.seasonDesp = seasonDesp;
}
/* public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesp='" + seasonDesp + '\'' +
'}';
}*/
}
枚举类实现接口。
package com.geng;
public class SeasonTest {
public static void main(String[] args){
Season season01=Season.AUTUMN;
season01.show();
}
}
interface Info{
void show();
}
enum Season implements Info{
SPRING("春天","春天真好"){
@Override
public void show() {
System.out.println("春天在哪里");
}
},
SUMMER("夏天","夏天也好"){
@Override
public void show() {
System.out.println("夏天快点来");
}
},
AUTUMN("秋天","秋天也行"){
@Override
public void show() {
System.out.println("秋天来了吗");
}
},
WINTER("冬天","冬天很好"){
@Override
public void show() {
System.out.println("好像是冬天");
}
};
private final String seasonName;
private final String seasonDesp;
private Season(String seasonName, String seasonDesp) {
this.seasonName = seasonName;
this.seasonDesp = seasonDesp;
}
/* public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesp='" + seasonDesp + '\'' +
'}';
}*/
}
注解(Annotation)
从jdk5.0开始,java中增加了对元数据的支持(MetaData)也就是注解(Annotation)
注解就是代码里面的标记,通过这些标记我们可以在编译、类加载、运行时呗读取,并且执行相应的处理。可以用于修饰包、类、构造器、方法、成员变量、参数、局部变量的声明
框架=注解+反射+设计模式
生成文档相关的注解:
编译时格式检查的注解(jdk内置的三个基本注解):
eg:
@SuppressWarnings(”unused“)抑制变量未曾使用的警告
@SuppressWarnings({"unused","rawtypes"})抑制变量未曾使用和为添加泛型的警告
自定义注解:
1、定义新的注解(Annotation)类型使用@interface关键字
2、自定义注解继承了java.lang.annotation.Annotation接口
3、Annotation成员变量在Annotation定义中以无参数方法的形式来声明。其方法名和返回值定义了该成员的名字和类型。我们称成员变量为配置参数。类型可以为几乎所有的java数据类型
4、我们可以使用default关键字为成员变量指定初始值
5、如果只有一个参数成员,建议使用value作为属性名
6、如果我们在使用注解的时候,如果只有一个参数成员且名称为value,那么可以直接指定值不用使用属性名
7、没有定义成员的Annotation为标记,包含成员的Annotation称之为元数据Annotation
自定义的注解要通过信息处理流程才会有意义(通过反射实现)
元注解(元注解)
jdk中的元注解用于修饰其他的Annotation定义,jdk5.0提供了4个标准的meta-Annotation,分别是
1、Retention
只能修饰一个Annotation定义,用于指定该Annotation的生命周期,@Retention包含一个RetentionPolicy类型的成员变量,使用@Retention的时候必须为该(value)成员变量赋值
RetentionPolicy.SOURCE在源文件中有效(即源文件保留),编译器直接丢弃这种策略的注释
RetentionPolicy.CLASS(默认)在class文件中有效(即class保留),当运行java程序的时候,jvm不会保留注释
RetentionPolicy.RUNTIME在运行时有效(即运行时有效),当运行java程序的时候,程序可以通过反射获取该注解
2、Target
用于指定被修饰的Annotation可以修饰哪些元素。
3、Documented
用于指定被该元注解修饰的Annotation类将被javadoc工具提成为文档,默认情况下,javadoc是不会包括注解的(比如@Deprecated)
4、Inherited
修饰的Annotation将会具有继承性(某个类使用该注解进行修饰,它的子类自动具有该注解的效果)
jdk8新特性:
可重复注解:同一个注解修饰一个地方使用多次
类型注解:
元数据
对现有数据进行修饰的数据,比如说String name=“gyp”;这个语句中,我们的现有数据是gyp,String和name都是对现有数据进行修饰,所以String和name就被称为元数据