单例模式

饿汉式

“饿汉式”单例
1、将所有的构造方法私有化,以避免在该类之外创建其实例
2、提供一个 类变量 用来缓存本类唯一的实例
3、提供一个可以返回当前类的实例的类方法 ( 静态工厂方法 : static factory method )
/
public class Sun {
private static final Sun SUN = new Sun(); // 直接创建 Sun 实例
// 构造被私有化
private Sun() {
}
// 提供一个用来获取本类的实例的类方法
public static Sun getInstance() {
return SUN ;
}
}

懒汉式

public class Moon {

  1. **private** **static** **Moon** moon ; // 没有直接创建 Moon 类的实例<br /> **private** **Moon**() {<br /> }<br /> **public** **static** **Moon** **getInstance**() {<br /> //望 getInstance 方法首次执行时才创建 Moon 实例<br /> if( moon == null ) { 我们期<br /> moon = **new** **Moon**();<br /> }<br /> **return** moon ;<br /> }<br />}

多例模式

与单例模式相似,比如季节,有四个实例

/
“懒汉式”多例 ( Multiton )
/
public class Gender** {

  1. **private** **static** **Gender** female ; // 女<br /> **private** **static** **Gender** male ; // 男
  2. **private** **int** index ;<br /> **private** **String** name ;
  3. **private** **Gender**(**int** index, **String** name) {<br /> **super**();<br /> **this**.index = index;<br /> **this**.name = name;<br /> }<br /> @Override<br /> **public** **String** **toString**() {<br /> **return** "Gender [index=" + index + ", name=" + name + "]";<br /> }
  4. **public** **static** **Gender** **of**( **int** index ) {<br /> **switch** ( index ) {<br /> **case** 1 : **return** of( "女" );<br /> **case** 2 : **return** of( "男" );<br /> **default**:<br /> **return** **null** ;<br /> }<br /> }
  5. **public** **static** **Gender** **of**( **String** name ) {<br /> **switch** ( name ) {<br /> **case** "女":<br /> **if**( female == **null** ) {<br /> **female = new Gender( 1 , "女" );**<br /> }<br /> **return** female ;<br /> **case** "男":<br /> **if**( male == **null** ) {<br /> **male**** ****=**** new Gender****(**** ****2**** ****,**** ****"男"**** ****);**<br /> }<br /> **return** male ;<br /> **default**:<br /> **return** **null** ;<br /> }<br /> }<br />}

枚举

意义

使用枚举可以实现单例或者多例
枚举名称的命名规则和类名相同
枚举采用enum关键字定义

父类

所有的枚举类型都继承了java.lang.Enum类
所有的枚举类型都不能通过extends显示继承java.lang.Enum类

枚举常量

枚举常量必须声明在枚举类的首行代码声明(第一个分号之前)
所有的枚举常量的修饰符都是public static final
声明枚举常量时可以调用枚举类的指定构造方法(通过参数确定)
**

成员变量

可以在枚举中定义类变量
可以在枚举中定义实例变量

成员方法

可以在枚举中定义类方法
可以在枚举中定义实例方法

构造方法

枚举中所有的构造方法都是私有的
即使不为构造方法显示指定private修饰符也是私有的
编译器会自动生成构造方法中的super(…)代码

编辑器生产的方法

public static X valueOf(String name)
public static X[] values()
比如:public enum GenderEnum {
FEMALE( “靓妹” ) , MALE( “靓仔” );
private String description ;
private GenderEnum(String description) {
this.description = description;
}
@Override
public String toString() {
// 枚举可以重写从 java.lang.Enum 类中继承的 toString()
// java.lang.Enum 类重写了从 java.lang.Object 继承的 toString 方法
return super.toString() + “ : “ + description ;
}

}

public class GenderEnumTest {
public static void main(String[] args) throws NoSuchMethodException, SecurityException {
System.out.println( GenderEnum.FEMALE );
System.out.println( GenderEnum.MALE );
System.out.println( “~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~” );
// 编译器 为 每一个 枚举类增加了一个 valueOf( String ) 方法,用于根据 枚举常量名称 获取 枚举常量
GenderEnum g = GenderEnum.valueOf( “FEMALE” ); // 参数是 枚举常量名称 ( 英文字母严格区分大小写 )
System.out.println( g );
System.out.println( g == GenderEnum.FEMALE );//true
System.out.println( “~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~” );
GenderEnum[] array = GenderEnum.values();
System.out.println( Arrays.toString( array ) );
System.out.println( “~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~” );
// java.lang.Enum 类中的 类方法 valueOf 可以通过 Enum 类来调用
GenderEnum x = Enum.valueOf( GenderEnum.class , “MALE” );
System.out.println( x );
// java.lang.Enum 类中的 类方法 valueOf 可以通过其 子类 来调用
GenderEnum y = GenderEnum.valueOf( GenderEnum.class , “MALE” );
System.out.println( y );
}

java.lang.Enum类

特点

它是所有java 语言枚举类型的公共基本类
支持自然排序(实现了java,lang.Comparable 接口)
支持序列化和反序列化(实现了java.io.Serializable)

构造

protected Enum(String name,int oridinal)

程序员无法调用此类构造方法
改构造方法用于由响应枚举类型声明的编译器发出的代码
参数name表示枚举常量的名称,它是用来声明该常量的标识符
参数index表示枚举常量的序数(它在枚举声明中的位置,其中初始常量序数为零)

实例方法

public finalString name()
public final int ordinal()
public final boolean equals(Object other)
public final int hashCode()
public String toString()

类方法

public static >T valueOf(ClassenumType,String name)