JAVA基础之设计模式和枚举

枚举

枚举是JDK1.5版本新增的特性(泛型、For-each等如今被广泛应用的特性也是由JDK1.5时所新增的),另外到了JDK1.6后switch语句支持枚举类型;

  • 枚举的使用情况:
    有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便;
    枚举就是将所有的有限的类对象先定义好;
  • 语法
public enum 枚举类名{
   
	//枚举的所有对象都必须在第一行定义好
}

比如:

public enum Sex {
   
    // 男性
    MALE("男"),
    // 女性
    FEMALE("女");
    
    private String cnName;
	//可以定义方法
    public String cnName() {
   
        return this.cnName;
    }

    // 构造方法不能是公共的
    Sex(String cnName) {
   
        this.cnName = cnName;
    }

}
public enum Week {
   
    MON, TUE, WED, THU, FRI, SAT, SUN
}

枚举类内也可以定义属性和方法,可是是静态的和非静态的

但是构造方法必须为私有的;在定义枚举类型时我们使用的关键字是enum,与class关键字类似,只不过前者是定义枚举类型,后者是定义类类型。枚举类型Day中分别定义了从周一到周日的值,这里要注意,值一般是大写的字母,多个值之间以逗号分隔。同时我们应该知道的是枚举类型可以像类(class)类型一样,定义为一个单独的文件,当然也可以定义在其他类内部,更重要的是枚举常量在类型安全性和便捷性都很有保证,如果出现类型问题编译器也会提示我们改进,但务必记住枚举表示的类型其取值是必须有限的,也就是说每个值都是可以枚举出来的,比如上述描述的一周共有七天。
同时枚举也给我们提供了更多的方法操作所定义对象;
以上面性别枚举类举例;

//获取枚举对象的序号,序号从0开始
System.out.println(Sex.MALE.ordinal());
    System.out.println(Sex.FEMALE.ordinal());

    // 把枚举对象转为字符串
    System.out.println(Sex.MALE.name());
    
    // 把字符串转为枚举对象, 虚拟机中的枚举对象只会有一份, 可以用== 来比较
    System.out.println(Sex.valueOf("MALE") == Sex.MALE);

    // 打印所有的枚举对象
    for (Sex value : Sex.values()) {
        System.out.println(value);
    }

设计模式

定义:编程中的一些套路,让我们的代码实现特定的目的,结构上更加优秀;

  • 单例模式
    单例模式(Singleton Pattern)
    定义:虚拟机中这个类只有一个实例(一个对象);
    特点:
    1、单例类只能有一个实例。
    2、单例类必须自己创建自己的唯一实例。
    3、单例类必须给所有其他对象提供这一实例。
    单例顾名思义,就只能有一个实例;因此它需要私有,然后自己去创建出这一个唯一实例;同时它又不是说就只能自己使用,它还需要给所有其他对象提供这个实例,供他们使用,因此简单单例的代码就有了大致模板;
public class Singleton1 {
   

    /**
     * 让构造方法私有,别人就没法创建此类的实例了
     */
    private Singleton1() {
   
    }
    /**
     * 自己创建这个实例
     */
    private static final Singleton1 ME = new Singleton1();

    /**
     * 获取唯一实例
     */
    public static Singleton1 getInstance() {
   
        return ME;
    }
}

上面我们就看出来,我们先创建了私有的构造方法,然后自行和创建他的实例;最后给一个公有方法返回我们创造的对象实例;供其他对象调用;
但是我们想一下,这种方法在一开始就创建出了唯一的单例了,可是如果我们很久不用呢?这种方法就叫饿汉式的单例模式,就不管别人用不用,在一开始就创建好实例;这种方法就不太好;
所以我们也可以在真正需要实例的时候再创建;这种方式叫懒汉式单例
但是懒汉式单例就会出现一个问题,即如果在多线程的环境下,就不一定能保证单例;
比如上面的例子如果我们的实例方法这样写

public class Singleton1 {
   
    private Singleton1() {
   
    }
    private static final Singleton1 ME = new Singleton1();
	public static Singleton2 getInstance() {
   
        if (ME == null) {
   
            ME = new Singleton2();
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值