JavaSE枚举学习心得

1.多例设计模式

  在学习枚举前,我们得了解一下一下多例设计模式,多例模式是为了限制本类实例化对象的产生个数
  多例设计模式的特点:构造方法私有化,类内部需要提供若干个实例化对象,后面过static方法返回。

  • eg.
/*
定义一个描述颜色的多例类(表示有限个数的对象的类),
构造方法私有化以后在类的内部提供对象                                                                                                                
 */
class Color{
    private String name;//在多例中标识对象
    //首先构造方法私有化
    private static Color RED = new Color("Red");
    private static Color YELLO = new Color("yello");
    private static Color BLUE = new Color("Blue");
    private Color(String name){
        this.name = name;
    }

    public static Color getInstance(String colorName){
        switch(colorName){
            case "Red":
                return RED;
            case "YELLO":
                return YELLO;
            case "BLUE":
                return BLUE;
            default:
                return null;
        }
    }
    
    //覆写toString,为了直接输出名字
    public String toString(){
        return this.name;
    }
}

public class Test1 {
    public static void main(String[] args) {
        Color red = Color.getInstance("Red");
        Color blue = Color.getInstance("Blue");
        System.out.println(red);
        System.out.println(blue);
    }
}

2.用枚举优化多例设计模式

  多例模式的目的是限制本类实例化对象的产生个数。但是如果对象过分多则会很麻烦,所以在JDK1.5有了枚举,上述多例代码可以用枚举来替代。

  • eg.
enum Color2 {
   RED2,BLUE2;
}
public class Test2 {
   public static void main(String[] args) {
       Color2 red2 = Color2.RED2;
       Color2 blue2 = Color2.BLUE2;
       System.out.println(red2);
       System.out.println(blue2);
   }
}

  enum并不是一个新的结构,使用enum定义的枚举默认继承Enum枚举类。因此enum定义的枚举结构实际上就是一个多例类。

3.Enum常用的三个方法

3.1 ordinal():返回枚举对象下标,默认第一个对象编号为0。
3.2 name():返回枚举对象名称,默认与对象名称保持一致。
3.3 values():返回所有枚举对象。
eg.


enum Color3 {
    RED3,BLUE3,YELLOW3
}
public class Test3 {
    public static void main(String[] args) {
        Color3 red3 = Color3.RED3;
        //ordinal()方法返回他的枚举编号,name()方法返回枚举名称(默认与对象名称保持一致)
        System.out.println(red3.ordinal() + " = " + red3.name());
        //values()返回所有枚举对象
        Color3[] colors = Color3.values();
        for (Color3 color3:colors) {
            System.out.println(color3);
        }
    }
}

4.枚举中支持定义其它结构

如构造方法,普通属性,普通方法等(类里面有什么东西,他里面就有什么)
当枚举类中还包含有其他结构,枚举对象的定义必须放在首行。
eg.

//enum Color3实际就是class Color3 只是名称不同
enum Color4 {
    //默认通过无参构造产生,此时定义了有参构造之后,必须给里面传参
    RED4("红"),BLUE4("蓝"),YELLOW4("黄");
    //如果想修改名字,可以扩展一个普通的名称, 但是这三个是通过无参构造传入的,想将title传入需要有参构造
    private String title;
    private Color4(String title){
        this.title = title;
    }
    public String toString(){
        return this.title;
    }
}
public class Test4 {
    public static void main(String[] args) {
        Color4 red4 = Color4.RED4;
        System.out.println(red4);
    }
}

枚举可以实现接口,枚举中的对象成为接口对象。
eg.

/*
枚举实现接口
 */
interface IColor {
	//由于这个方法被覆写,那么枚举类中的这三个对象就自动变成了ICOlor()对象
    String getTitle5();
}

enum Color5 implements IColor {
    RED5("红"),BLUE5("蓝"),YELLOW5("黄");
    private String title5;
    private Color5(String title5){
        this.title5 = title5;
    }
    public String toString(){
        return this.title5;
    }
    public String getTitle5() {
        return title5;
    }
}
public class Test5 {
    public static void main(String[] args) {
      IColor color5 = Color5.RED5;//此时这个枚举对象就自动向上转型变成了接口对象
        System.out.println(color5.getTitle5());
    }
}

猜你喜欢

转载自blog.csdn.net/qq_38534524/article/details/89469932