Java基础编程-枚举类与注解
程序员文章站
2024-03-11 22:15:49
...
本文全文参考 https://www.bilibili.com/video
枚举类
1. 枚举类的说明:
- 1.枚举类的理解:类的对象只有有限个,确定的。我们称此类为枚举类
- 2.当需要定义一组常量时,强烈建议使用枚举类
- 3.如果枚举类中只一个对象,则可以作为单例模式的实现方式。
2. jdk 5.0 之前自定义枚举类
public class SeasonTest {
public static void main(String[] args) {
Season spring = Season.SPRING;
String seasonName = spring.getSeasonName();
System.out.println(seasonName); // 春天
System.out.println(spring.toString()); // Season{seasonName='春天', seasonDesc='春天到了'}
}
}
// jdk 5.0 之前自定义枚举类
class Season{
// 1.声明Season对象的属性
private final String seasonName;
private final String seasonDesc;
// 2.私有化类的构造器
private Season(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
// 3.提供当前枚举类的多个对象
public static final Season SPRING = new Season("春天","春天到了");
public static final Season SUMMER = new Season("夏天","夏天到了");
public static final Season AUTUMN = new Season("秋天","秋天到了");
public static final Season WINTER = new Season("冬天","冬天到了");
// 4.其他诉求1:获取枚举类对象的属性
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
// 4.其他诉求2:提供toString()方法
@Override
public String toString() {
return "Season{" +
"seasonName='" + seasonName + '\'' +
", seasonDesc='" + seasonDesc + '\'' +
'}';
}
}
3. jdk 5.0 新增使用enum定义枚举类。
// jdk 5.0 新增使用enum定义枚举类。
enum Season1{
SPRING("春天","春天到了"),
SUMMER("夏天","夏天到了"),
AUTUMN("秋天","秋天到了"),
WINTER("冬天","冬天到了");
private final String seasonName;
private final String seasonDesc;
Season1(String seasonName, String seasonDesc) {
this.seasonName = seasonName;
this.seasonDesc = seasonDesc;
}
public String getSeasonName() {
return seasonName;
}
public String getSeasonDesc() {
return seasonDesc;
}
}
4. 使用enum定义枚举类之后,枚举类常用方法:(继承于java.lang.Enum类)
- values() :返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
注解
1. 注解的理解
2. 注解的使用示例
示例一:生成文档相关的注解
示例二:在编译时进行格式检查(JDK内置的三个基本注解)
示例三:跟踪代码依赖性,实现替代配置文件功能
3. 如何自定义注解
4. 元注解 :对现有的注解进行解释说明的注解。
- 元注解:对现有注解进行解释说明的注解
- 元数据:对现有数据进行修饰的数据
- 示例:Override 注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.SOURCE)
public @interface Override {
}
5. 如何获取注解信息
- 通过发射来进行获取、调用。
- 前提:要求此注解的元注解Retention中声明的生命周期状态为:RUNTIME.
6.JDK8中注解的新特性
6.1 可重复注解
- 下面是JDK8中的重复注解( java.lang.annotation.Repeatable)定义的源码。
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.ANNOTATION_TYPE)
public @interface Repeatable {
Class<? extends Annotation> value();
}
- 重复注解,即一个注解可以在一个类、方法或者字段上同时使用多次,如Spring中可以使用多个扫描组件来扫描多个包的注解。
@ComponentScan
@ComponentScan
public class Configuration{
}
- ComponentScan的源码。
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
- ComponentScans的源码
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Repeatable(ComponentScans.class)
public @interface ComponentScan {
...
- 下面来演示下重复注解的实现。
public static void main(String[] args) {
for (Token token : UserToken.class.getAnnotationsByType(Token.class)) {
System.out.println(token.value());
}
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Tokens {
Token[] value();
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(Tokens.class)
public @interface Token {
String value();
}
@Token("666666")
@Token("888888")
public interface UserToken {
}
- 输出结果:
666666
888888
6.2 类型注解
下一篇: JIT 入门