本文共 4394 字,大约阅读时间需要 14 分钟。
如果类的对象只有一个,可以考虑使用单例模式,当需要定义一组常量时,强烈建议使用枚举类,枚举类的对象只有有限个,确定的。
举例如下:星期类、性别类、季节类、订单状态类、线程状态类等。
类似单例模式定义类的方式,我们自定义枚举类的时候考虑如下几种情况:
1.对象的属性:private final修饰,对象是常量了,属性那肯定也是常量
2.私有化类的构造器,并给对象属性赋值,类外无法调用构造器,也就是类外无法通过new的方式创建对象。类内部提供了多个对象了,类外不再提供构造对象的方法。
3.提供当前枚举类的多个对象:public static final的,公共的、
4.可提供get方法和toString()方法
//StatusTest.javapackage com.ylaihui.enumtest;class Status{ private final String name; private Status(String name){ this.name = name; } public static final Status VALID = new Status("valid"); public static final Status NONVALID = new Status("nonvalid"); public String getName() { return name; } @Override public String toString() { return "Status{" + "name='" + name + '\'' + '}'; }}public class StatusTest { public static void main(String[] args) { Status valid = Status.VALID; System.out.println(valid); Status nonvalid = Status.NONVALID; System.out.println(nonvalid); }}
1.提供当前枚举类的对象,多个对象之间用","隔开,末尾对象";"结束
2.声明对象的属性:private final修饰
3.私有化类的构造器,并给对象属性赋值
4.可提供get方法和toString()方法
//EnumStatusTest.javapackage com.ylaihui.enumtest;enum EnumStatus{ VALID("valid"), NONVALID("nonvalid"); private final String name; private EnumStatus(String name){ this.name = name; } public String getName() { return name; } //@Override //public String toString() { // return "EnumStatus{" + // "name='" + name + '\'' + // '}'; //}}public class EnumStatusTest { public static void main(String[] args) { EnumStatus valid = EnumStatus.VALID; EnumStatus nonvalid = EnumStatus.NONVALID; System.out.println(valid); // VALID,调用了 Enum类中的toString方法 System.out.println(nonvalid); // NONVALID 调用了 Enum 类中的toString方法 }}
values()方法:返回枚举类型的对象数组。该方法可以很方便地遍历所有的枚举值。
valueOf(String str):可以把一个字符串转为对应的枚举类对象。要求字符串必须是枚举类对象的“名字”。如不是,会有运行时异常:IllegalArgumentException。
toString():返回当前枚举类对象常量的名称
//EnumMethodTest.javapackage com.ylaihui.enumtest;import java.util.Arrays;enum EnumStatus1{ VALID("valid"), NONVALID("nonvalid"); private final String name; private EnumStatus1(String name){ this.name = name; } public String getName() { return name; } //@Override //public String toString() { // return "EnumStatus{" + // "name='" + name + '\'' + // '}'; //}}public class EnumMethodTest { public static void main(String[] args) { //values() 方法 EnumStatus1[] values = EnumStatus1.values(); System.out.println(Arrays.toString(values)); for (int i = 0; i
代码运行输出:
[VALID, NONVALID]
VALID
NONVALID
Thread State: NEW
Thread State: RUNNABLE
Thread State: BLOCKED
Thread State: WAITING
Thread State: TIMED_WAITING
Thread State: TERMINATED
NEW
NEW
和普通 Java 类一样,枚举类可以实现一个或多个接口
若每个枚举值在调用实现的接口方法呈现相同的行为方式,则只要统一实现该方法即可。
若需要每个枚举值在调用实现的接口方法呈现出不同的行为方式,则可以让每个枚举值分别来实现该方法
一般性的做法:实现接口,并提供方法
//EnumStatus.javapackage com.ylaihui.enumabstract;interface Desc{ public void show();}enum Status implements Desc{ VALID("valid"), NONVALID("nonvalid"); private final String name; private Status(String name) { this.name = name; } @Override public void show() { System.out.println("enum Status: " + this.name); }}public class EnumStatus { public static void main(String[] args) { Status[] values = Status.values(); for (int i = 0; i < values.length; i++) { System.out.println(values[i]); values[i].show(); } }}
枚举类中的每个对象都实现下抽象方法
//EnumStatus.javapackage com.ylaihui.enumabstractmethod;interface Desc{ public void show();}enum Status implements Desc{ VALID("valid"){ @Override public void show() { System.out.println("in object show : valid"); } }, NONVALID("nonvalid"){ @Override public void show() { System.out.println("in object show : nonvalid"); } }; private final String name; private Status(String name) { this.name = name; }}public class EnumStatus { public static void main(String[] args) { Status[] values = Status.values(); for (int i = 0; i < values.length; i++) { System.out.println(values[i]); values[i].show(); } }}
转载地址:http://wxuhf.baihongyu.com/