枚举
枚举是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();