枚举单例模式

Java中的枚举类非常强大的。之前看过单例的许多实现,对于枚举的单例略有了解,但理解不够深刻,最近结合实例研究了一下,感觉枚举是很强大且非常好用。

首先看一个最简单的枚举单例模式:
public enum  TestEnum {
    TEST_ENUM;
}
其中TEST_ENUM,即为TestEnum类的唯一实例。这样写可能一眼看去,没什么意义。也不是很好理解。下面以生成一个单例的CGLib动态代理类作为场景进行总结。先放代码:

代理类

import java.lang.reflect.Method;

public enum CGLibProxyEnum implements MethodInterceptor {
    CG_LIB_PROXY_ENUM;

    public  T getProxy(Class cls) {
        return (T)Enhancer.create(cls, this);
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        return methodProxy.invokeSuper(o, objects);
    }
}

测试类

class Hello {
    public void sayHello() {
        System.out.println("Hello, new Boys");
    }
}
public class Test {
    public static void main(String[] args) {
        Hello helloProxy = CGLibProxyEnum.CG_LIB_PROXY_ENUM.getProxy(Hello.class);
        helloProxy.sayHello();
   }
}
测试结果打印:Hello, new Boys

上面的CGLibProxyEnum枚举类实现了MethodInterceptor接口,并重写了其中的intercept方法。在其内部创建了唯一的实例CG_LIB_PROXY_ENUM;这是由其默认的私有的构造器创建的。
这里可以看出,枚举单例模式非常简单,易于实现,且类型安全。而且有着和普通类一样的基本功能。并且枚举类默认final修饰,不允许被继承。

你可能感兴趣的:(Java)