zoukankan      html  css  js  c++  java
  • 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中没有,但是可以调用)

  • 相关阅读:
    VS2012开发调试PHP扩展
    Android webapi
    拖动上传文件
    IE11被识别为mozilla
    jquery validate.js 不能验证
    如何安装或卸载 Internet Explorer 9?
    C# 操作IIS -App & AppPools
    Filewatcher
    Notepad++使用技巧
    u-boot-2012.04.01移植笔记——支持NAND启动
  • 原文地址:https://www.cnblogs.com/xfdhh/p/11255886.html
Copyright © 2011-2022 走看看