黑马程序员 枚举,注解

 

 ----------android培训java培训、java学习型技术博客、期待与您交流! -----------

1,普遍类实现枚举

        因为某些情况下,取值很少,且固定,那么为了防止其他输入,就可以定义枚举,那么先用普通类来实现。

       步骤:1,私有化构造函数

                   2,每个枚举成员定义成静态常量

                   3,可以为每个常量添加方法(具体,自定义)

public class WeekDay {
//Step1. 私有化构造方法
    private WeekDay(){}
//Step2. 每一个元素为全局常量,public static final ----枚举中的常量元素
    public static final WeekDay MON =new WeekDay();
    public static final WeekDay SUN =new WeekDay();
//Step3. 自定义的若干方法
    public WeekDay nextDay(){
       if(this == MON)   //MON为枚举常量
           return SUN;
       return MON;
    }
/*
    缺点:如果枚举常量值非常多的时候,这个方法中会存在大量的if...else if... else
*/
    public String toString(){
       return (this==SUN)? "SUN": "MON";
    }
}

为了解决if......else......分支多的情况,把nextDay方法抽象出来,让每个常量自己实现这个方法(具体方法)。

package cn.itcast.day1;
/*
 * 用Java的普通类来模拟Java中的枚举类型
 * */
public abstract class WeekDayII {
    //Step1. 私有化构造方法
    private WeekDayII(){}
    // 采用匿名内部类
    public static final WeekDayII MON =new WeekDayII(){
       @Override
       public WeekDayII nextDay() {
           return SUN;
       }
       public String toString(){
           return "MON";
       }
    };
    public static final WeekDayII SUN =new WeekDayII(){
       @Override
       public WeekDayII nextDay() {
           return MON;
       }
       public String toString(){
           return "SUN";
       }
    };
    public abstract WeekDayII nextDay();  
}
 

从代码中可以看出,自定义方法和具体方法的差别还是很大的,具体方法简洁明了,自定义方法比较臃肿,程序可读性很差。

2,枚举

           枚举的引入就是为了解决普通类实现枚举的麻烦,普通类实现枚举,工作量很大,如果用枚举,就会很简单。

下面看一个简单的枚举示例:

public enum WeekDayEnum {
    SUN, MON, TUE, WED, THU, FRI, SAT
} 
class TestEnum{
    public static void main(String[] args) {
       WeekDayEnumweekDay =WeekDayEnum.TUE;
       System.out.println(weekDay);
    }
}

验证结果:

为枚举指定构造函数,(所有的构造函数都要私有化,主要方式使用一对大括号跟在常量的后面,里面加可以加参数)

public enum WeekDay{
		SUN(1),MON(),TUE,WED,THI,FRI,SAT;
		private WeekDay(){
			System.out.println("first");
		}
		private WeekDay(int day){
			System.out.println("second");
		}
	}

调用函数:

WeekDay weekDay1 = WeekDay.TUE;

验证结果:


为枚举指定抽象方法

public enum TrafficLamp{
		RED(30){
			@Override
			public TrafficLamp nextLamp() {
				// TODO Auto-generated method stub
				return GREEN;
			}
		},GREEN(45){
			@Override
			public TrafficLamp nextLamp() {
				// TODO Auto-generated method stub
				return YELLOW;
			}
		},YELLOW(5) {
			@Override
			public TrafficLamp nextLamp() {
				// TODO Auto-generated method stub
				return RED;
			}
		};
		public abstract TrafficLamp nextLamp();
		private int time;
		private TrafficLamp(int time){
			this.time = time;
		}
	}
}

为枚举指定抽象方法的好处是,将功能细化了,否则的化枚举的函数需要用分支语句处理相应的逻辑,比如下个灯的颜色,抽象出来,让子类实现,这样子类只要考虑自己的下个灯就可以了,不用考虑其他灯。

枚举总结:
JDK5中的枚举和普通类的关系

           枚举类型是一种特殊的类

           枚举中的枚举元素全部是全局常量

           枚举元素实际上是这个枚举类型的引用全局常量

           这些引用全局常量由enum保证显式初始化之后,指向了枚举类型的一个匿名内部子类实例

            定义枚举元素时候不用书写类型,由enum关键字保证这个常量的类型

补充:如果枚举只有一个元素,那么就是单例模式了。

3,注解

           注解的定义:注解是java中的特殊标记(也可以叫做源文件的补充信息)

           作用:向编译器表达一些信息,如方法遗弃,警告,重写等等。

           注意:注解的作用范围是全局的,所有元素都是它的注解对象,包括局部变量。

           元注解: @Retention,@Target,@Documented,@Inherited(主要是修饰其他注解)

           基本注解:@Override,@Deprecated,@SuppressWarnings(java开发常见的三个)

           注解的生命周期:注解驻留在源文件阶段,字节码文件阶段和内存字节码阶段

4,元注解的使用

      a,@Target    用于指定被修饰的注解的适用范围,即被修饰的注解可以用来修饰哪些程序元素

@Target({ElementType.METHOD,ElementType.TYPE})//方法和类型都行,type是class的parent
public @interface itcastAnnotationTest {	
}

       ElementType一共有七种取值, TYPE, FIELD,METHOD,PARAMETER,CONSTRUCTOR,LOCAL_VARIABLE, ANNOTATION_TYPE,  PACKAGE       
      b,@Retention  用来描述被修饰的注解的生命周期

@Retention(RetentionPolicy.RUNTIME)//保留到运行期间
public @interface itcastAnnotationTest {
	String color() default "blue";
}

         RetentionPolicy一共有三种取值:SOURCE, CLASS, RUNTIME  

      c,@Documented  用于指定被修饰的注解将被javadoc工具提取成文档。如果定义注解的时候使用了@Documented进行了修饰,则使用了@Documented注解修饰的注解所修饰的其他程序元素的API文档都会包含该注解的说明。

      d,@Inherited 用于指定被@Inherited修饰的注解具有继承性

5,基本注解的使用

      a,@Override  在需要重写父类方法的子类方法前面打上@Override注解,会提示开发者要重写这个父类的方法发生书写上的错误,@Override就会通过javac提示开发者父类没有这个可以重写的方法,这样就能避免子类重写父类方法因为笔误而导致没有真实覆盖父类的方法。

@Override
	public String toString() {
		// TODO Auto-generated method stub
		return super.toString();
	}

       b,@Deprecated   表示所修饰的程序元素已经过时,此时javac将在eclipse工具中在这个程序元素中打上下划线表示不推荐这个过时的程序元素的使用。

@Deprecated
	public static void sayHello(){
		System.out.println("好好学习");
	}

       c,@SuppressWarnings  抑制javac产生警告注释 (通常说的报黄)。

@SuppressWarnings("deprecation")
	public static void main(String[] args) {
		AnnotationDemo.sayHello();
	}

6,自定义注解,为注解增加属性

        注意:注解中成员方法也是成员变量,对内是以成员方法定义,对外是以成员变量定义。

下面给出示例:

注解A

public @interface A {
	String value();
}

注解heima:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface heima {
	A a() default @A("mingren");
	String color() default "red";
	String value();
	int[] arrayAttr() default {3,4,6};
}

class类:

@heima(a=@A("file"),color="green",value="27",arrayAttr=3)
public class AnnotationDemo {
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		if(AnnotationDemo.class.isAnnotationPresent(heima.class)){
			heima annotationDemo = (heima)AnnotationDemo.class.getAnnotation(heima.class);
			System.out.println(annotationDemo.color());
		}
	}
}

验证结果:


补充:打印的结果使用反射的方式获取的,下篇重点讲解反射。

总结:1,注解中可以添加常用的数据类型,包括基本数据类型,Object及其子类,枚举,注解也可以。

            2,默认时注解只有一个属性value时,在类上加注解时,不需要写出名字

            3,注解可以设置默认值,在类上声明可以重写赋值,数组的使用可以简化,当数组中只有一个值时,可以不用加大括号。

            4,数组的赋值不能用new(切记)



----------android培训java培训、java学习型技术博客、期待与您交流! -----------

 


 


 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值