熟练掌握JDK1.5枚举类型

2016-02-19 18:40 7 1 收藏

图老师小编精心整理的熟练掌握JDK1.5枚举类型希望大家喜欢,觉得好的亲们记得收藏起来哦!您的支持就是小编更新的动力~

【 tulaoshi.com - 编程语言 】

  熟练把握JDK1.5枚举类型

  在上一篇文章JDK1.5新特性简介里面,我们讨论了Enum的最简单形式,即类似于,
  public enum Color{
  Red,
  Green,
  Blue;
  }

  这篇文章我们来具体介绍一下enum的各项特征。Enum作为Sun全新引进的一个要害字,看起来很象是非凡的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。 当我们在声明一个enum类型时,我们应该注重到enum类型有如下的一些特征。

  

  1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。

  2.所有枚举值都是public , static , final的。注重这一点只是针对于枚举值,我们可以和在普通类里面定义 变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。
  3.Enum默认实现了java.lang.Comparable接口。

  4.Enum覆载了了toString方法,因此我们假如调用Color.Blue.toString()默认返回字符串”Blue”.

  5.Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue.因此我们在自己重写toString方法的时候就要注重到这一点,一把来说应该相对应地重写valueOf方法。
  6.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。

  7.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定,这里Color.Red.ordinal()返回0。

  
  了解了这些基本特性,我们来看看如何使用它们。
  1.遍历所有有枚举值. 知道了有values方法,我们可以轻车熟路地用ForEach循环来遍历了枚举值了。
  for (Color c: Color.values())
  System.out.println(“find value:” + c);

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  2.在enum中定义方法和变量,比如我们可以为Color增加一个方法随机返回一个颜色。
  public enum Color {
  Red,
  Green,
  Blue;

  /*
  *定义一个变量表示枚举值的数目。
  *(我有点希奇为什么sun没有给enum直接提供一个size方法).
  */
  private static int number = Color.values().length ;

  /**
  * 随机返回一个枚举值
  @return a random enum value.
  */
  public static Color getRandomColor(){
  long random = System.currentTimeMillis() % number;
  switch ((int) random){
  case 0:
  return Color.Red;
  case 1:
  return Color.Green;
  case 2:
  return Color.Blue;
  default : return Color.Red;
  }
  }
  }

  可以看出这在枚举类型里定义变量和方法和在普通类里面定义方法和变量没有什么区别。唯一要注重的只是变量和方法定义必须放在所有枚举值定义的后面,否则编译器会给出一个错误。

  
  3.覆载(Override)toString, valueOf方法。
  前面我们已经知道enum提供了toString,valueOf等方法,很多时候我们都需要覆载默认的toString方法,那么对于enum我们怎么做呢。其实这和覆载一个普通class的toString方法没有什么区别。
  ….
  public String toString(){
  switch (this){
  case Red:
  return "Color.Red";
  case Green:
  return "Color.Green";
  case Blue:
  return "Color.Blue";
  default:
  return "Unknow Color";

  }
  }
  ….
  这时我们可以看到,此时再用前面的遍历代码打印出来的是
  Color.Red
  Color.Green
  Color.Blue
  而不是
  Red
  Green
  Blue.
  可以看到toString确实是被覆载了。一般来说在覆载toString的时候我们同时也应该覆载valueOf方法,以保持它们相互的一致性。

  4.使用构造函数。
  虽然enum不可以有public的构造函数,但是我们还是可以定义private的构造函数,在enum内部使用。还是用Color这个例子。

  public enum Color {
  Red("This is Red"),
  Green("This is Green"),
  Blue("This is Blue");

  private String desc;

  Color(String desc){
  this.desc = desc;
  }

  public String getDesc(){
  return this.desc;
  }

  }
  这里我们为每一个颜色提供了一个说明信息, 然后定义了一个构造函数接受这个说明信息。
  要注重这里构造函数不能为public或者protected, 从而保证构造函数只能在内部使用,客户代码不能new一个枚举值的实例出来。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  5.实现特定的接口
  我们已经知道enum可以定义变量和方法,它要实现一个接口也和普通class实现一个接口一样,这里就不作示例了。

  
  6.定义枚举值自己的方法。
  前面我们看到可以为enum定义一些方法,其实我们甚至可以为每一个枚举值定义方法。这样,我们前面覆载 toString的例子可以被改写成这样。
  public enum Color {
  Red {
  public String toString(){
  return "Color.Red";
  }
  },
  Green {
  public String toString(){
  return "Color.Green";
  }
  },
  Blue{
  public String toString(){
  return "Color.Blue";
  }

  

来源:http://www.tulaoshi.com/n/20160219/1618565.html

延伸阅读
枚举中有values方法用于按照枚举定义的顺序生成一个数组,可以用来历遍。我们自定义的枚举类都是继承自java.lang.Enum,拥有一下实例中的功能: 代码如下: //: enumerated/EnumClass.java // Capabilities of the Enum class import static net.mindview.util.Print.*; enum Shrubbery { GROUND, CRAWLING, HANGING } public class Enum...
  假如一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。 !-- frame contents -- !-- /frame contents -- 举个例子来说明一吧,为了让大家更明白一点,比如一个铅笔盒中有一支笔,但在没有打开...
如果一个变量你需要几种可能存在的值,那么就可以被定义成为枚举类型。之所以叫枚举就是说将变量或者叫对象可能存在的情况也可以说是可能的值一一例举出来。 举个例子来说明一吧,为了让大家更明白一点,比如一个铅笔合中有一支笔,但在没有打开之前你并不知道它是什么笔,可能是铅笔也可能是钢笔,这里有两种可能,那么你就可以定义一个枚举...
using System; class EnumExample { public enum TimeOfDay :int { Morning=0, Afternoon=1, Evening=2 } public static int Main() { WriteGreeting(TimeOfDay.Morning); return 0; } static void WriteGreeting(TimeOfDay timeOfDay) { switch(timeOfDay) { case TimeOfDay.Morning: Console.WriteLine("Good morning!"); bre...
?XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />   Windows 98/ME: 简单的方法就是运行msconfig,这会显示一个实用程序, 在这里可以设置:      设置项目如下:        Java_HOME=L:JavaJ2SE     //你...

经验教程

282

收藏

26
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部