Java基础——枚举和注解

一、枚举类
 当类的对象是有限个,且确定(各个属性值确定)的时候,可以使用枚举。
 枚举类使用enum关键字定义,需要注意:
  1️⃣定义enum时必须私有化构造器
  2️⃣枚举对象必须在enum类的首行定义
  3️⃣若枚举类对象有属性则这些属性必须声明为private final(不声明为final虽不会报语法等错误,而且可以通过setter重新给这些属性赋值,但是这样就失去了枚举的意义,枚举的对象就是要确定不变)

 枚举类也可以实现接口,且有两种不同的实现方式:
  ①让枚举类直接实现此接口,则该类的所有枚举对象共享同一套抽象方法的实现;
   示例1:枚举类直接实现接口方法

interface Info {//接口
	void show(Season season);
}

enum Season implements Info {//枚举类并实现接口
	SPRING("spring", "春天"), 
	SUMMER("summer", "夏天"), 
	AUTUMN("autumn", "秋天"), 
	WINTER("winter", "动天");//首行定义枚举对象
	
	private final String name;//枚举对象属性声明为final的
	private final String desc;
	
	private Season(String name, String desc) {//私有化构造器
		this.name = name;
		this.desc = desc;
	};

	public String getName() {
		return name;
	}

	public String getDesc() {
		return desc;
	}

	@Override
	public void show(Season season) {//实现接口方法
		System.out.println("一年四季" + season.desc);//实现逻辑
	}
}

  ②让类的每一个枚举对象分别实现接口的抽象方法,进而通过类的枚举对象调用被重写的抽象方法时,实现不同的业务逻辑
   示例2:枚举对象实现接口方法,未自定义实现接口方法的枚举对象会使用枚举类的抽象方法实现,即枚举对象的接口方法实现优先于枚举类的接口方法实现

interface Info {
	void show(Season season);
}

enum Season implements Info {
	SPRING("spring", "春天") {
		public void show(Season s) {
			System.out.println("春天:" + s.getDesc());
		}
	},
	SUMMER("summer", "夏天") {
		public void show(Season s) {
			System.out.println("春天:" + s.getDesc());
		}
	},
	AUTUMN("autumn", "秋天") {

	},
	WINTER("winter", "动天") {

	};

	private final String name;
	private final String desc;

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

	public String getName() {
		return name;
	}

	public String getDesc() {
		return desc;
	}

	@Override
	public void show(Season season) {
		System.out.println("一年四季在于" + season.desc);

	}
}

  Tip:可通过枚举来实现单例
 经常使用的enum的方法有values()和valueOf(String name):

Season[] values = Season.values();//枚举类的所有对象
for(Season s : values)
	System.out.println(s.getDesc());

Season valueOf = Season.valueOf("SPRING");//入参为枚举对象的名称,否則會報錯
System.out.println(valueOf.getDesc());

Season valueOf2 = Season.valueOf(Season.class, "SUMMER");
System.out.println(valueOf2.getDesc());

二、注解Annotation
 元注解:对现有的注解进行注解的注解
  @Retention:表明所修饰的注解的生命周期,SOURCE / CLASS(默认) / RUNTIME
   RetentionPolicy.SOURCE:注解只在源码中显示,编译时即忽略
   RetentionPolicy.CLASS:在编译时会记录在class文件中,但运行时会忽略
   RetentionPolicy.RUNTIME:在编译时会记录在class文件中,运行时也会保留,只有定义为这种类型的注解才可以通过反射获取到
  @Target:表明所修饰的注解可以用来修饰的类的结构,值有TYPE, FIELD, METHOD, PARAMETER, CONSTRUCTOR, LOCAL_VARIABLE
  @Documented:表明所修饰的注解可以被javadoc解析
  @Inherited:表明所修饰的注解是否具有继承性
 示例:

@Target({ ElementType.PARAMETER })
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
	String value() default "java8";//注解的属性和默认值
}

//使用
public void show(@MyAnnotation(value = "str") String str) {
	System.out.println(str);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值