在开发项目中,我们常用的单例模式是饿汉式和饱汉式,对表态内部类Singleton,虽然能够起到一定的延迟与线程安全,但是我觉得写这样写不是很好,因为在我们大多数开发过程 中,在一个类中放的是自己的一些属性与方法。加一个表态类部类在里不舒服。对于单例的最好实现是用单元线枚举类型,自己不用写private 构造(),用的时候与其他地方没有差别,直接都是类.instance.方法
demo:
package lml.base.singleton;
public enum Singleton {
instance;
public void operation(){
System.out.println("sfd");
}
}
调用:Singleton.instance.operation();就可以了,挺方便的吧!
看到能用Enum类型来解决这个问题,太爽了,在Java 1.5版本后,只需要编写一个包含单个的元素的枚举类型。这种方法提供了无偿的序列化机制,绝对防止了多次实例化。单元素的枚举类型是实现Singleton的最佳方法。
Enum的一些性质
1.使用构造函数
虽然enum不可以有public的构造函数,但是我们还是可以定义private的构造函数,在enum内部使用。
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的常量而已。
2.实现特定的接口
我们已经知道enum可以定义变量和方法,它要实现一个接口也和普通class实现一个接口一样,这里就不作示例了。
3.定义枚举值自己的方法。
我们还可以为enum定义一些方法,其实我们甚至可以为每一个枚举值定义方法。
- public enum Color {
- Red {
- public String toString(){
- return "Color.Red";
- }
- },
- Green {
- public String toString(){
- return "Color.Green";
- }
- },
- Blue{
- public String toString(){
- return "Color.Blue";
- }
- };
- }