Java 单例模式、枚举

单例模式

1、在当前系统中,某个类型的对象,最多只能有一个,就需要使用单例设计模式

2、几种格式

//老汉式
class WeekDay1{
    //1.构造方法私有化
    private WeekDay1() {}
    //2.创建静态常量对象
    public static final WeekDay1 MON = new WeekDay1();
}
//饿汉式
class WeekDay2{
    //1.构造方法私有化
    private WeekDay2() {}
    //2.创建本类静态私有对象
    private static WeekDay2 Mon = new WeekDay2();
    //3.对外提供私有对象的访问
    public static WeekDay2 getInstance() {
        return Mon;
    }
}
//懒汉式
class WeekDay3
{
    //1.构造方法私有化
    private WeekDay3(){}
    //2.声明本类私有对象
    private static WeekDay3 Mon;
    //3.判断并创建对象
    public static WeekDay3 getInstance(){
        if(Mon==null){
            Mon = new WeekDay3();
        }
        return Mon;
    }
}

3、问题:单例模式会不会产生线程安全问题?如何解决?会不会影响效率?如何提升效率?

  单例模式的懒汉式会产生线程安全问题,可以使用同步代码块解决,效率问题看下面代码

class WeekDay3
{
    //1.构造方法私有化
    private WeekDay3(){}
    //2.声明本类私有对象
    private static WeekDay3 Mon;
    //3.判断并创建对象
    public static WeekDay3 getInstance(){
        //因为只有第一次才会判断,所以再判断一次可以提高效率
        if(Mon==null) {
            //加同步代码块可以解决线程不安全的问题,但效率会变低
            synchronized (WeekDay3.class) {
                if(Mon==null){
                    Mon = new WeekDay3();
                }
            }
        }
        return Mon;
    }
}

枚举

1、什么是枚举?

  描述对象个数有限的类

 2、本质上是有多个对象的单例设计模式

3、关键字enum,声明出来也是一个类,编译也是.class文件

abstract class WeekDay1{//WeekDay2的对比类
    String name;
    private WeekDay1() {}
    public abstract void run();
    private WeekDay1(String name) {this.name=name;}
    public static final WeekDay1 MON = new WeekDay1("1") {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            
        }
    };
    public static final WeekDay1 TUE = new WeekDay1("2") {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            
        }
    };
    public static final WeekDay1 WEN = new WeekDay1("3") {
        @Override
        public void run() {
            // TODO Auto-generated method stub
            
        }
    };
    
}
enum WeekDay2{//可以实现抽象方法,直接写在对象后的大括号内
    MON("1"){
        @Override
        public void run() {
            
            
        }
    },TUE("2"){
        @Override
        public void run() {
            
            
        }
    },WEN("3"){
        @Override
        public void run() {
            
            
        }
    };
    String name;
    public void setName(String name) {this.name=name;}
    public String getName() {return name;}
    private WeekDay2(String name) {this.name = name;}
    public abstract void run();
}
enum WeekDay3{
    MON,TUE,WEN;//相当于普通类中public static final WeekDay3 MON=new WeekDay3();..
}
enum WeekDay4{//可以定义属性,直接写在对象名后的()内
    MON("1"),TUE("2"),WEN("3");
    private String name;
    private WeekDay4(String name) {
        this.name = name;
    }
}
枚举

4、注意事项

  所有的枚举项必须写在枚举类型的第一行,枚举项之间使用逗号隔开,最后用分号结束。

  枚举类中也有构造方法,只能默认空参构造,需手动定义有参构造,所有的构造方法必须是私有化的。

  枚举类型可以有抽象方法,但必须在枚举项实现。

5、枚举类型常用方法  

  1、所有使用enum关键字声明的类型,全都是Enum类型的子类

  2、常用特有方法:

   compareTo(E e):用于比较两个枚举项的顺序,如果调用者序号小返回负数;如果调用者序号大,则返回正数;

      ordinal():返回的就是枚举项的系数

   name():返回该对象的对象名称(枚举项的名称),不能重写

   toString():返回该对象的对象名称(枚举项的名称),可以重写

   values():返回该枚举类型的所有枚举项(API中没有,但是可以调用)

原文地址:https://www.cnblogs.com/xfdhh/p/11255886.html