Java枚举类型的使用 (二)

2014-11-24 11:22:27 · 作者: · 浏览: 12
leTon(){};

  private static Singleton instance = null;

  public static synchronized SingleTon getInstance()

  {

  if(instance == null)

  instance = new Singleton();

  return instance;

  }

  }

  4. 因值而异的类实现(Value-Specific Class Bodies)

  这个功能简单地说像是在使用匿名内部类来实现Command模式,它可以为每个枚举值定义各自的类本体与方法实现。

  一种实现方式如下:

  Java代码

  public interface IDescription

  {

  public String getDescription();

  }

  public enum MoreAction implements IDescription

  {

  TURN_LEFT

  {

  //实现接口上的方法

  public String getString() {return "向左转"}

  }, //注意这里的枚举值分隔使用,

  TURN_RIGHT

  {

  //实现接口上的方法

  public String getString() {return "向右转"}

  }, //注意这里的枚举值分隔使用,

  SHOOT

  {

  //实现接口上的方法

  public String getString() {return "射击"}

  }; //注意这里的枚举值结束使用;

  }

  每个枚举成员的{与}之间是类本体,还可以在其中如同定义类一样地声明数据成员或者数据方法。测试这段代码的程序如下:

  Java代码

  public class MoreActionDemo

  {

  public static void main(String[] args)

  {

  for(MoreAction action : MoreAction.values())

  {

  System.out.printf("%s: %s%n",action,action.getDescription());

  }

  }

  }

  这个例子是将因值而异的类实现用在返回枚举值的描述上,可以按照相同的方式,为每个枚举值加上一些各自的方法实现,而调用的接口是统一的。执行结果如下:

  D:\Java_Test>javac IDescription.java

  D:\Java_Test>javac MoreAction.java

  D:\Java_Test>javac MoreActionDemo.java

  D:\Java_Test>java MoreActionDemo

  TURN_LEFT: 向左转

  TURN_RIGHT: 向右转

  SHOOT: 射击

  可能是利用枚举类型实现的接口中的方法,这里直接用

  D:\Java_Test>javac IDescription.java 编译时会提示找不到getDescription()方法,所以,只好挨个来编译了。

  也可以运用抽象方法去改写上面的MoreAction.java,如下:

  Java代码

  public enum MoreAction2

  {

  TURN_LEFT{

  //实现抽象方法

  public String getDescription()

  {

  return "向左转";

  }

  }, //记得这里的枚举值分隔使用,

  TURN_RIGHT{

  //实现抽象方法

  public String getDescription()

  {

  return "向右转";

  }

  },

  SHOOT{

  //实现抽象方法

  public String getDescription()

  {

  return "射击";

  }

  }; //记得这里的枚举值结束使用;

  //声明抽象方法

  public abstract String getDescription();

  }

  执行结果与上面相同。