黑马程序员_Java基础_枚举 和 单例模式实例

------- android培训java培训、期待与您交流! ----------


 枚举就是要某个类型的变量的取值只能为若干个固定的值中的一个
否则编译失败,枚举可以让编译器在编译时就可以控制源程序中填写的非法值,
普通变量的方式在开发阶段无法实现这一目标
 条件:
 1.使用的构造方法
 2.每个元素分别用一个公有的静态成员变量表示
 3.可以有若干共有方法,
 
需求:定义星期几的变量
<strong>public abstract class Weekday {

    private Weekday(){};

    

    public final static Weekday SUN = new Weekday(){


        @Override

        public Weekday nextday() {

            return MON;

        }

        

    };


    public final static Weekday MON = new Weekday(){


        @Override

        public Weekday nextday() {

            // TODO Auto-generated method stub

            return SUN;

        }

        

    };

    

    public abstract Weekday nextday();

    

    @Override

    public String toString() {

        return this==SUN?"SUN":"MON";

    }

}</strong>
<strong>public class EnumDemo {

    public static void main(String[] args) {

        Weekday week1 = Weekday.SUN;

        System.out.println(week1.nextday());  //输出:MON

        

        Week week = Week.THL; 

        System.out.println(week);   //THl

        System.out.println(week.name());  //THL

        System.out.println(week.ordinal()); //4,第四个位置

        System.out.println(Week.valueOf("SUN"));  //SUM

        System.out.println(Week.values().length);   //7

    }

}

//jdk1.5后可以自定义个枚举对象

enum Week{

    SUN,MON,TUE,WED,THL,FRI,SAT

}</strong>
 枚举就相当于一个类,其中也可以定义构造方法,成语变量,普通方法和抽象方法
枚举的元素必须位于枚举体的最开始部分,枚举元素列表又有分号与其他成员分隔,把枚举中的成员方法或者变量等放在枚举元素的前面,
编译器会报错
带构造方法的枚举:
构造方法必须定义成私有的
枚举只有一个成员时,就可以作为一个单例的实现方式
 //需求:使用枚举制作红绿灯
public class EnumDemo2 {


    public static void main(String[] args) {

        TrafficLamp lamp = TrafficLamp.RED;

        System.out.println(lamp.nextLamp());  //GREEN


    }


}


enum TrafficLamp{

    RED(30){


        @Override

        public TrafficLamp nextLamp() {

            // TODO Auto-generated method stub

            return GREEN;

        }

    },

    GREEN(45){

        public TrafficLamp nextLamp() {

            // TODO Auto-generated method stub

            return null;

        }

    },

    YELLOW(5){

        public TrafficLamp nextLamp() {

            // TODO Auto-generated method stub

            return RED;

        }

        

    };

    public abstract TrafficLamp nextLamp();

    private int time;

    private TrafficLamp(int time) {

        this.time = time;

    }

    

}

  单例模式 就是一种常见的软件设计模式。
单例模式的作用:可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源,系统中只存在一个对象。
我们锁了解到的开发所用到的模式有那些?
1.装饰模式;(灵活,避免继承体系的臃肿,提供更强的功能)
2.代理模式;
3,适配器模式
4,抽象工厂;
实现单例模式的方法有很多,可以使用不同的语言进行编写,我们这就创建两个简单的单例模式 (不同方式)
方法一: (饿汉式)

class Single {
 private static final Single s = new Single();
 private Single() {
 }
 public static Single getInstance() {
 return s;
 }
 }

分析:代码中的构造函数必须设置为私有的,不然用户会使用构造函数进行创建新的对象;  该单例对象在系统启动时就立即创建,我们可以使用静态方法直接引用。

方法二:(懒汉式) 
  使用懒汉式如果是多线程程序,会出现多线程的安全问题,所用我们必须使用同步锁进行操作,防止多线程同时创建多个对象
  好处:懒加载(和现在的图片懒加载、Hibernate延时加载)
class Single {
    private static Single s = null;
    private Single() {
    }
    public static Single getInstance() {
        if (s == null) {
            synchronized (Single.class) {
                if (s == null) {
                    s = new Single();
                }
            }
        }
        return s;
    }
}

代码分析:懒汉式也就是懒加载,系统启动是还不会立即创建单例对象,当用户调用时,才真正的创建单例对象,但是,当我们使用的是多线程操作时,可能就会出现线程的安全问题,为了保证单例,我们必须使用同步锁进行安全保护,使得共享的数据不存在安全问题!
 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值