enum 类是java1.5之后新添加的功能类,主要用在表示日期、性别、颜色等。可以统一定义常用的常量。
enum类可以看作一个普通的java类,用实例化的enum类来表示常量(如日期、性别)。因为构造方法为private,所以java开发者不能通过外部创建enum的实例。只能通过enum类自己内部实例化。所以表示常量的enum实例都为单例模式。
public enum SexC { MALE,FAMALE; SexC(){ System.out.println("初始化SexC实例"); } }public class TestEnum { @Test public void test(){ SexC sex1 =SexC.FAMALE; SexC sex2 =SexC.FAMALE; System.out.println(sex1 == sex2); } }
初始化SexC实例 初始化SexC实例 true
通过例子可以看出在加载SexC 类的时候 实例化来两个对象,应该分别是MALE FAMAL 。引用sex1和sex2同时指向单例FAMAL "=="的结果为true。
下面例子丰富了下enum类,实例化enum对象可以通过()调用构造方法 通过{} 实现抽象类中的抽象方法。类似匿名函数的写法,但匿名函数只使用一次,enum实例可以随意调用,单例模式。
package enums; /** * Created by fengxinzi on 17-11-21. */ public enum Lamp { /** * 实例化RED对象的时候使用带参构造初始化对象内部的time属性。因为Lamp中存在抽象方法, * 所以实例化RED对象中需要实现该getNextLamp()方法 */ RED(30){ @Override public Lamp getNextLamp() { return YELLOW; } }, YELLOW(5){ @Override public Lamp getNextLamp(){ return GREEN; } }, GREEN(20){ @Override public Lamp getNextLamp(){ return RED; } }; private int time ; public int getTime(){ return time; } //带参构造 Lamp(int time){ this.time =time; } //抽象方法 public abstract Lamp getNextLamp (); }
@Test public void test(){ Lamp green = Lamp.GREEN; Lamp nextLamp = green.getNextLamp(); System.out.println(nextLamp); Lamp[] values = Lamp.values(); for(Lamp lamp :values){ System.out.println(lamp.getNextLamp()); System.out.println(lamp.getTime()); } }
打印输出为:
RED
YELLOW
30
GREEN
5
RED
20