Java 单例Singleton

来源:互联网 发布:淘宝店可以转让吗 编辑:程序博客网 时间:2024/06/06 01:33

在开发项目中,我们常用的单例模式是饿汉式和饱汉式,对表态内部类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定义一些方法,其实我们甚至可以为每一个枚举值定义方法。 

 

  1. public enum Color {   
  2. Red {   
  3. public String toString(){   
  4.  return "Color.Red";   
  5. }   
  6. },   
  7. Green {   
  8. public String toString(){   
  9.  return "Color.Green";   
  10. }   
  11. },   
  12. Blue{   
  13. public String toString(){   
  14.  return "Color.Blue";   
  15. }   
  16. };   
  17. }