Singleton in action with enum- the preferred approach

秒速五厘米 2022-09-28 13:20 69阅读 0赞
  1. 测试困难,因为无法给singleton替换模拟实现,除非它实现充当其类型的接口。
  2. jdk5以前,都是把构造器声明为私有,导出公有静态成员;

    //Singleton with public final field
    public class Elvis{

    1. public static final Elvis INSTANCE = new Elvis();
    2. private Elvis(){...}
    3. public void leaveTheBuildings(){...}

这种方法,使用反射机制,设置AccessibleObject.setAccessible,会允许其访问私有构造函数。
静态工厂方法的实现:

  1. //Singleton with static factory
  2. public class Elvis{
  3. private static final Elvis INSTANCE = new Elvis();
  4. private Elvis(){...}
  5. private static Elvis getInstanceJ(){
  6. return INSTANCE;}
  7. public void leaveTheBuilding(){...}
  8. }

在性能上无优势,其优势是灵活性。但是在反序列化的时候会生成一个新的实例,要实现readResolve方法。

在JDK5以后可以使用新的枚举技术实现singleton,而且提供了序列化机机制,也就是说以后生成单例模式就直接使用这种方法就可以了。

结论:单元素的枚举类型已经成为实现singleton的最佳方法,代码如下:

  1. //Enum singleton - the preferred approach
  2. public enum Elvis{
  3. INSTANCE("zhang san",1);
  4. private String name;
  5. private int no;
  6. private Elvis(String name, int no){
  7. this.name = name;
  8. this.no = no;
  9. }
  10. public void leaveTheBuilding(){...}
  11. }

也就是说单例的方式的实现通过只有一个枚举值的方法来实现。

枚举的相关知识

向枚举中添加新方法

如果打算自定义自己的方法,那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。

  1. public enum Color {
  2. RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
  3. // 成员变量
  4. private String name;
  5. private int index;
  6. // 构造方法
  7. private Color(String name, int index) {
  8. this.name = name;
  9. this.index = index;
  10. }
  11. // 普通方法
  12. public static String getName(int index) {
  13. for (Color c : Color.values()) {
  14. if (c.getIndex() == index) {
  15. return c.name;
  16. }
  17. }
  18. return null;
  19. }
  20. // get set 方法
  21. public String getName() {
  22. return name;
  23. }
  24. public void setName(String name) {
  25. this.name = name;
  26. }
  27. public int getIndex() {
  28. return index;
  29. }
  30. public void setIndex(int index) {
  31. this.index = index;
  32. }
  33. }

枚举实现接口

所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承,所以枚举对象不能再继承其他类。

  1. public interface Behaviour {
  2. void print();
  3. String getInfo();
  4. }
  5. public enum Color implements Behaviour{
  6. RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
  7. // 成员变量
  8. private String name;
  9. private int index;
  10. // 构造方法
  11. private Color(String name, int index) {
  12. this.name = name;
  13. this.index = index;
  14. }
  15. //接口方法
  16. @Override
  17. public String getInfo() {
  18. return this.name;
  19. }
  20. //接口方法
  21. @Override
  22. public void print() {
  23. System.out.println(this.index+":"+this.name);
  24. }
  25. }

使用接口组织枚举

  1. public interface Food {
  2. enum Coffee implements Food{
  3. BLACK_COFFEE,DECAF_COFFEE,LATTE,CAPPUCCINO
  4. }
  5. enum Dessert implements Food{
  6. FRUIT, CAKE, GELATO
  7. }
  8. }

发表评论

表情:
评论列表 (有 0 条评论,69人围观)

还没有评论,来说两句吧...

相关阅读

    相关 DSL In Action

    > 伴随着Kotlin的发展,有一个神奇的框架 `anko-layout`,一直存在于我们的视野却又一直因为各种原因无法用于生产环境中。最近在写项目时,再次拿出anko这个框架