注解和枚举
注解
注解是什么?
注意的意义: 1.让我们资源[类,属性,方法]具有特殊的意义
2.存放一些信息
数据库-->规则数据
XML 小型的数据库
注解 解决XML不好找的问题而产生的
注解就是标注在类或者方法或者属性上的标记 标记的开头一般是@
2种
系统内置的注解 一般具有特殊的意义 识别内置注解的编译器或者JVM
@Override 只能标注在方法上 表示该方法是对父类的方法的重写 限制了该方法的使用规范
@SuppressWarnings("rawtypes") 标注在任何地方 用来忽略系统的警告
@Target({})
自己写的注解 自己来编写识别他们的规则
如何来自定义个注解
1.创建一个注解类 @interface
public @interface NiubiTag
{
}
2.告诉编译器注解可以使用在什么场合 使用内置Target注解
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
public @interface NiubiTag
{
}
3.告诉编译器注解可以使用在什么区域有效 编译区域 运行区域
@Target({ElementType.TYPE,ElementType.METHOD,ElementType.FIELD})
@Retention(RetentionPolicy.SOURCE)
public @interface NiubiTag
{
}
RetentionPolicy.RUNTIME 在运行时有效
RetentionPolicy.SOURCE 在编译时有效
4.使用注解
@NiubiTag
public class Person{
}
5.注解要存放一些信息,需要给注解添加一些属性
基本数据类型,字符串类型,枚举类型,数组类型
如果该注解的属性没有default 我们在使用注解的时候 一定要设置值
如果使用了default 我们可以选择设置值去替换初始值
public @interface NiubiTag{
类型 属性名[value]() default 初始值
}
@NiubiTag(具体的数据) 如果属性名是value 可以省略掉属性名
@NiubiTag(属性名=具体的数据)
@NiubiTag({,}) 数组类型
public class Person{
}
我们确定要解析注解的过程,一般配合反射一起用,目前没有使用的场景
枚举
枚举是特殊的类
接口是特殊类
注解是特殊的类
这么说的原因是因为他们都会被编译为class文件
枚举类的目的: 某个类的单例的对象的体验
限制该类单例的个数
单例模式
保证在当前的JVM内存中有且只有一个对象,如果某个对象会占用大量的内存资源,请把该对象设置为单例模式
例如: Runtime rt=Runtime.getRuntime(); 因为Runtime类会占用大量的系统内存
懒汉式
public class Person{
private static Person p=null;
//构造器私有化 防止在外部被其他对象实例化
private Person(){
}
public static Person getPerson()
{
if(p==null)
{
p=new Person();
return p;
}
else
{
return p;
}
}
}
饿汉式
public class Person{
private static Person p=new Person();
//构造器私有化 防止在外部被其他对象实例化
private Person(){
}
public static Person getPerson()
{
return p;
}
}
定义枚举
枚举类分为前面;后面 前面是枚举值[大写表示] 后面其他
枚举的目的为 限制该类的实例化的个数 保证对象只有几个 我们可以选择对象只能其中之一
public enum Enums{
RED,YELLOW,BLUE; //当前我Enums类实例化的方式只有3种
//构造器会对枚举值会有影响 因为枚举值本质就是实例化的对象
//相当于这样
//枚举值 底层是用单例模式去构建的 所有枚举构造器默认是私有的 不变修改其访问修饰符
// RED =new Enums();
// YELLOW =new Enums();
// BLUE=new Enums();
public static void main(String[]args)
{
//无论.RED多少次 获取的对象都是同一个 因为该对象是单例对象
//枚举.枚举值 就是枚举类的实例化方式
Enums e=Enums.RED;
Enums e1=Enums.RED;
Enums e2=Enums.RED;
e,e1,e2是同一个对象
//方法
e.name(); //将枚举值的名字转换为字符串
e.ordinal(); //枚举值的序号
Enums[] values = Enums.values(); //获取当前枚举类的所有枚举值
for(Enums value:values)
{
System.out.println(value.ordinal());
}
}
}
//某些方法参数是一个枚举类
public static void doSomeThing(Enums e)
{
}
public static void main(String[]args)
{
doSomeThing(Enums.RED)
}