注解和枚举

注解

注解是什么?
注意的意义: 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)
}

posted @ 2020-06-10 21:31  幻世纪  阅读(472)  评论(0编辑  收藏  举报