最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

枚举的理解及用法

互联网 admin 3浏览 0评论

枚举的理解及用法

枚举的理解及用法

在jdk5之后,增添了关键字enum,enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用。

为什么要使用enum?
个人理解是:程序中有时需要封装一些固定的值,更是为了程序安全考虑,如每个星期一定是有7天,每天都可以添加对应的信息。

源码

首先来看看它的源码是怎么样的

public abstract class Enum<E extends Enum<E>>implements Comparable<E>, Serializable {public final String name() {return name;}private final int ordinal;public final int ordinal() {return ordinal;}protected Enum(String name, int ordinal) {this.name = name;this.ordinal = ordinal;}public String toString() {return name;}public final boolean equals(Object other) {return this==other;}public final int hashCode() {return super.hashCode();}protected final Object clone() throws CloneNotSupportedException {throw new CloneNotSupportedException();}public final int compareTo(E o) {Enum<?> other = (Enum<?>)o;Enum<E> self = this;if (self.getClass() != other.getClass() && // optimizationself.getDeclaringClass() != other.getDeclaringClass())throw new ClassCastException();return self.ordinal - other.ordinal;}@SuppressWarnings("unchecked")public final Class<E> getDeclaringClass() {Class<?> clazz = getClass();Class<?> zuper = clazz.getSuperclass();return (zuper == Enum.class) ? (Class<E>)clazz : (Class<E>)zuper;}public static <T extends Enum<T>> T valueOf(Class<T> enumType,String name) {T result = enumType.enumConstantDirectory().get(name);if (result != null)return result;if (name == null)throw new NullPointerException("Name is null");throw new IllegalArgumentException("No enum constant " + enumType.getCanonicalName() + "." + name);}protected final void finalize() { }private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException {throw new InvalidObjectException("can't deserialize enum");}private void readObjectNoData() throws ObjectStreamException {throw new InvalidObjectException("can't deserialize enum");}
}

分析:

  1. values方法返回enum实例的数组,而且是有顺序
  2. ordinal方法返回一个int值
  3. 提供equals和hashCode,同时实现Comparable和Serializable
  4. 调用getDeclaringClass,可以返回所属类
  5. name是返回enum实例声明的名字

不存在的values方法?
values是由编译器添加的statis方法

基本enum特性

以星期为例子:

public enum Week {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}
public class EnumOrder {public static void main(String[] args) {for (Week w : Week.values()){System.out.println(w + " , ordinal " + w.ordinal());}System.out.println("=======================================");Week w = Week.valueOf("Wednesday");System.out.println(w.name() + " , ordinal " + w.ordinal());System.out.println(w.getDeclaringClass().getName());System.out.println(w.toString().getClass().getName());}
} /*
Monday , ordinal 0
Tuesday , ordinal 1
Wednesday , ordinal 2
Thursday , ordinal 3
Friday , ordinal 4
Saturday , ordinal 5
Sunday , ordinal 6
=======================================
Wednesday , ordinal 2
com.company.Enum.Week
java.lang.String
*///:~

将静态导入用于enum

import static com.company.Enum.Week.*;public class StaticEnum {Week week;public StaticEnum(Week week) {this.week = week;}@Overridepublic String toString() {return "StaticEnum is " + week;}public static void main(String[] args) {System.out.println(new StaticEnum(Monday));System.out.println(new StaticEnum(Tuesday));System.out.println(new StaticEnum(Wednesday));}
}

使用static import能够将enum实例的标识符带入当前的命名空间,所以无需再用enum类型来修饰enum实例

向enum中添加新方法

现在向Week添加获取数字的方法

public enum Week {Monday(1),Tuesday(2),Wednesday(3),Thursday(4),Friday(5),Saturday(6),Sunday(7);private int num;private Week(int num){this.num = num;}public int getNum(){return num;}
}public class EnumInt {public static void main(String[] args) {for(Week w : Week.values()){System.out.println(w + " : " + w.getNum());}}
}/* output
Monday : 1
Tuesday : 2
Wednesday : 3
Thursday : 4
Friday : 5
Saturday : 6
Sunday : 7
*///:~

switch语句中的enum

使用switch时,发现enum与它有很多相似之处,两人的结合可谓是“天设地造”了

package com.company.Enum;public class SwitchEnum {public static void translation(Week week){switch (week){case Monday:System.out.println("Monday的中文是周一");break;case Tuesday:System.out.println("Tuesday的中文是周二");break;case Wednesday:System.out.println("Wednesday的中文是周三");break;case Thursday:System.out.println("Thursday的中文是周四");break;case Friday:System.out.println("Friday的中文是周五");break;case Saturday:System.out.println("Saturday的中文是周六");break;case Sunday:System.out.println("Sunday的中文是周日");break;default:System.out.println("无法翻译");break;}}public static void main(String[] args) {translation(Week.Monday);translation(Week.Tuesday);translation(Week.Wednesday);translation(Week.Tuesday);translation(Week.Friday);translation(Week.Saturday);translation(Week.Sunday);}
}/*
Monday的中文是周一
Tuesday的中文是周二
Wednesday的中文是周三
Tuesday的中文是周二
Friday的中文是周五
Saturday的中文是周六
Sunday的中文是周日
*///:~

待续。。。
参考书籍:Java编程思想

枚举的理解及用法

枚举的理解及用法

在jdk5之后,增添了关键字enum,enum可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用。

为什么要使用enum?
个人理解是:程序中有时需要封装一些固定的值,更是为了程序安全考虑,如每个星期一定是有7天,每天都可以添加对应的信息。

源码

首先来看看它的源码是怎么样的

public abstract class Enum<E extends Enum<E>>implements Comparable<E>, Serializable {public final String name() {return name;}private final int ordinal;public final int ordinal() {return ordinal;}protected Enum(String name, int ordinal) {this.name = name;this.ordinal = ordinal;}public String toString() {return name;}public final boolean equals(Object other) {return this==other;}public final int hashCode() {return super.hashCode();}protected final Object clone() throws CloneNotSupportedException {throw new CloneNotSupportedException();}public final int compareTo(E o) {Enum<?> other = (Enum<?>)o;Enum<E> self = this;if (self.getClass() != other.getClass() && // optimizationself.getDeclaringClass() != other.getDeclaringClass())throw new ClassCastException();return self.ordinal - other.ordinal;}@SuppressWarnings("unchecked")public final Class<E> getDeclaringClass() {Class<?> clazz = getClass();Class<?> zuper = clazz.getSuperclass();return (zuper == Enum.class) ? (Class<E>)clazz : (Class<E>)zuper;}public static <T extends Enum<T>> T valueOf(Class<T> enumType,String name) {T result = enumType.enumConstantDirectory().get(name);if (result != null)return result;if (name == null)throw new NullPointerException("Name is null");throw new IllegalArgumentException("No enum constant " + enumType.getCanonicalName() + "." + name);}protected final void finalize() { }private void readObject(ObjectInputStream in) throws IOException,ClassNotFoundException {throw new InvalidObjectException("can't deserialize enum");}private void readObjectNoData() throws ObjectStreamException {throw new InvalidObjectException("can't deserialize enum");}
}

分析:

  1. values方法返回enum实例的数组,而且是有顺序
  2. ordinal方法返回一个int值
  3. 提供equals和hashCode,同时实现Comparable和Serializable
  4. 调用getDeclaringClass,可以返回所属类
  5. name是返回enum实例声明的名字

不存在的values方法?
values是由编译器添加的statis方法

基本enum特性

以星期为例子:

public enum Week {Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday
}
public class EnumOrder {public static void main(String[] args) {for (Week w : Week.values()){System.out.println(w + " , ordinal " + w.ordinal());}System.out.println("=======================================");Week w = Week.valueOf("Wednesday");System.out.println(w.name() + " , ordinal " + w.ordinal());System.out.println(w.getDeclaringClass().getName());System.out.println(w.toString().getClass().getName());}
} /*
Monday , ordinal 0
Tuesday , ordinal 1
Wednesday , ordinal 2
Thursday , ordinal 3
Friday , ordinal 4
Saturday , ordinal 5
Sunday , ordinal 6
=======================================
Wednesday , ordinal 2
com.company.Enum.Week
java.lang.String
*///:~

将静态导入用于enum

import static com.company.Enum.Week.*;public class StaticEnum {Week week;public StaticEnum(Week week) {this.week = week;}@Overridepublic String toString() {return "StaticEnum is " + week;}public static void main(String[] args) {System.out.println(new StaticEnum(Monday));System.out.println(new StaticEnum(Tuesday));System.out.println(new StaticEnum(Wednesday));}
}

使用static import能够将enum实例的标识符带入当前的命名空间,所以无需再用enum类型来修饰enum实例

向enum中添加新方法

现在向Week添加获取数字的方法

public enum Week {Monday(1),Tuesday(2),Wednesday(3),Thursday(4),Friday(5),Saturday(6),Sunday(7);private int num;private Week(int num){this.num = num;}public int getNum(){return num;}
}public class EnumInt {public static void main(String[] args) {for(Week w : Week.values()){System.out.println(w + " : " + w.getNum());}}
}/* output
Monday : 1
Tuesday : 2
Wednesday : 3
Thursday : 4
Friday : 5
Saturday : 6
Sunday : 7
*///:~

switch语句中的enum

使用switch时,发现enum与它有很多相似之处,两人的结合可谓是“天设地造”了

package com.company.Enum;public class SwitchEnum {public static void translation(Week week){switch (week){case Monday:System.out.println("Monday的中文是周一");break;case Tuesday:System.out.println("Tuesday的中文是周二");break;case Wednesday:System.out.println("Wednesday的中文是周三");break;case Thursday:System.out.println("Thursday的中文是周四");break;case Friday:System.out.println("Friday的中文是周五");break;case Saturday:System.out.println("Saturday的中文是周六");break;case Sunday:System.out.println("Sunday的中文是周日");break;default:System.out.println("无法翻译");break;}}public static void main(String[] args) {translation(Week.Monday);translation(Week.Tuesday);translation(Week.Wednesday);translation(Week.Tuesday);translation(Week.Friday);translation(Week.Saturday);translation(Week.Sunday);}
}/*
Monday的中文是周一
Tuesday的中文是周二
Wednesday的中文是周三
Tuesday的中文是周二
Friday的中文是周五
Saturday的中文是周六
Sunday的中文是周日
*///:~

待续。。。
参考书籍:Java编程思想

与本文相关的文章

发布评论

评论列表 (0)

  1. 暂无评论