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();
}
执行结果与上面相同。