20180415 java java面向对象-枚举的操作细节
20180415 java java面向对象-枚举的操作细节
枚举的使用:
1、枚举中的都是全局的、公共的静态常量,可以直接使用枚举类名调用,使用以下格式接受:
类名 接受名称=类名.常量名;
Weekday day = Weekday.Friday;
2、因为 java.lang.Enum类是所有枚举类的父类,所以所有的枚举对象都可以调用 Enum类中的方法;
重点关注两个方法,name();和ordinal();
eg:
String name=枚举对象.name();//返回枚举对象的常量名称(即生命的名称)
int ordinal=枚举对象.ordinal();//返回枚举对象的序号(从零开始)
eg:
System.out.println(Weekday.Friday.name());//输出Friday
System.out.println(Weekday.Friday.ordinal());//输出5(即Friday的序号是4)
toString();方法 与name()方法类似,
枚举对象的常量名称,eg:
String str=枚举对象.toString();
3、由编译器生成的两个枚举类的静态方法:
values ();//返回枚举类型数组
eg:
Wekday[] wd =Weekday.values();//返回该类里的所有常量
valueof(String name);//把一个指定名称的字符串转换成当前枚举中的常量
格式:
枚举类型 valueOf(String name);
eg:
System.out.println(Weekday.valueOf("Fri"));//输出 Fri
System.out.println(Weekday.valueOf("abc"));//显示编译错误,因为枚举类型中没有 abc 这个常量。
4、从java5开始出现枚举,从java5开始 switch也支持操作枚举类型。
eg:
switch(Weekday.Sun)
{
case Mon:break;
case Tue:break;
case Wed:break;
}
所以switch只支持int类型,其他类型会在编译后自定提升为int类型。
switch支持枚举是因为底层使用的是枚举对象的ordinay(反编译后),而ordinay的类型依然是int类型。
枚举主要用来表示事物固定的类型。
推荐书籍《Effective java》。
在《Effective java》一书中提到,建议使用枚举类型做单例模式,很安全,即使使用反射也不能创建对象(而用类写的 单例模式(构造函数私有化),使用反射是可以创建对象的)。
用类写的 单例模式:
class ArrayUtil
{
private static final ArrayUtil instance = new ArrayUtil();
private Arrayutil(){};
public static ArrayUtil getInstance()
{
return instance;
}
public void sort(int[] arr)
{
System,out.println("做排序...");
}
}
class SingletonDemo
{
public static void main(String[] args)
{
System,out.println(ArrayUtil.getInstance() == ArrayUtil.getInstance());
ArrayUtil.getInstance().sort(null);
}
}
使用枚举实现单例模式:
enum ArrayUtil
{
INSTANCE ;
public void sort(int[] arr)
{
System,out.println("做排序...");
}
}
class SingletonDemo
{
public static void main(String[] args)
{
System,out.println(ArrayUtil.INSTANCE == ArrayUtil.INSTANCE);
ArrayUtil.INSTANCE.sort(null);
}
}