Java基础之枚举

可变参数的特点:

只能出现在参数列表的最后;

...位于变量类型和变量名之间,前后有无空格都可以;

调用可变参数的方法时,编译器为该可变参数隐含创建一个数组,在方法体中以数组的形式访问可变参数。

增强for循环:迭代的集体变量可以是数组或者是实现了Iterable接口的集合类,还可以在类型声明前加修饰符如final

写书的人在哪里看到的呢,知识的源头在java语言规范里。

基本类型的自动拆箱与装箱

Integer i1 = 1;
Integer i2 = 1;
System.out.println(i1 == i2);// true
Integer i3 = 137;
Integer i4 = 137;
System.out.println(i3 == i4);// false
Integer i5 = Integer.valueOf(3);
Integer i6 = Integer.valueOf(3);
System.out.println(i5 == i6);//true

如果装箱的整数在一个字节之内,即-128-127都会缓存起来,它认为这些小的整数使用的频率会很高。这就是(共享)享元(flyweight)设计模式,有很多小的对象,有很多属性相同,那些不同的属性变成方法的参数,称之为外部状态,那些相同的属性称之对象的内部状态。

有些东西不需要别人教,自己好奇试一下就懂了。

用普通类模拟枚举功能:

public abstract class WeekDay {
	private WeekDay() {// 私有构造方法
	}

	public final static WeekDay SUN = new WeekDay() {// 公有静态成员变量
		@Override
		public WeekDay nextDay() {
			return MON;
		}
	};
	public final static WeekDay MON = new WeekDay() {
		@Override
		public WeekDay nextDay() {
			return SUN;
		}
	};

	public abstract WeekDay nextDay();// 抽象方法用来避免大量的ifelse语句
	// public WeekDay nextDay() {
	// if (this == SUN) {
	// return MON;
	// } else {
	// return SUN;
	// }
	// }

	public String toString() {
		return this == SUN ? "SUN" : "MON";
	}
}

public class EnumTest {
	public static void main(String[] args) {
		WeekDay1 weekDay = WeekDay1.MON;
		System.out.println(weekDay.nextDay());

		WeekDay weekDay2 = WeekDay.FRI;
		System.out.println(weekDay2);
		System.out.println(weekDay2.name());
		System.out.println(weekDay2.ordinal());
		System.out.println(WeekDay.valueOf("SUN"));
		System.out.println(WeekDay.values().length);
	}

	public enum WeekDay {
		SUN, MON, TUE, WED, THI, FRI, SAT
	}
}

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");

	}
}

在枚举元素后加括号就表示调用哪种形式的构造方法,没有为什么,只是一种形式而已,而且是最容易想到或者接受的形式而已;

带有抽象方法的枚举

	public enum TrafficLamp {
		RED(30) {
			@Override
			public TrafficLamp nextLamp() {
				return GREEN;
			}
		},
		GREEN(45) {
			@Override
			public TrafficLamp nextLamp() {
				return YELLOW;
			}
		},
		YELLOW(5) {
			@Override
			public TrafficLamp nextLamp() {
				return RED;
			}
		};
		public abstract TrafficLamp nextLamp();

		private int time;

		private TrafficLamp(int time) {
			this.time = time;
		}
	}

枚举只有一个成员时,就可以作为一种单例的实现方式

 

posted @ 2016-09-20 22:01  john8169  阅读(111)  评论(0编辑  收藏  举报