列舉

Or_One發表於2020-12-14

列舉

假設我們要定義一個人類,人類中包含姓名和性別。通常會將性別定義成字串型別,效果如下:

public class Person {
    private String name;
    private String sex;

    public Person() {
    }

    public Person(String name, String sex) {
        this.name = name;
        this.sex = sex;
    }
	
    // 省略get/set/toString方法
}
public class Demo01 {
    public static void main(String[] args) {
        Person p1 = new Person("張三", "男");
        Person p2 = new Person("張三", "abc"); // 因為性別是字串,所以我們可以傳入任意字串
    }
}

不使用列舉存在的問題:可以給性別傳入任意的字串,導致性別是非法的資料,不安全

列舉的作用與應用場景

列舉的作用:一個方法接收的引數是固定範圍之內的時候,那麼即可使用列舉。

列舉的基本語法

列舉是一種特殊類。列舉是有固定例項個數的型別,我們可以把列舉理解成有固定個數例項的多例模式。

定義列舉的格式

enum 列舉名 {
    第一行都是羅列列舉例項,這些列舉例項直接寫大寫名字即可。
}

入門案例

  1. 定義列舉:BOY表示男,GIRL表示女
enum Sex {
    BOY, GIRL; // 男,女
}

  1. Perosn中的性別有String型別改為Sex列舉型別
public class Person {
    private String name;
    private Sex sex;

    public Person() {
    }

    public Person(String name, Sex sex) {
        this.name = name;
        this.sex = sex;
    }
    // 省略get/set/toString方法
}

  1. 使用是隻能傳入列舉中的固定值
public class Demo02 {
    public static void main(String[] args) {
        Person p1 = new Person("張三", Sex.BOY);
        Person p2 = new Person("張三", Sex.GIRL);
        Person p3 = new Person("張三", "abc");
    }
}

列舉的其他內容

列舉的本質是一個類,我們剛才定義的Sex列舉最終效果如下:

enum Sex {
    BOY, GIRL; // 男,女
}

// 列舉的本質是一個類,我們剛才定義的Sex列舉相當於下面的類
final class SEX extends java.lang.Enum<SEX> {
    public static final SEX BOY = new SEX();
    public static final SEX GIRL = new SEX();
    public static SEX[] values();
    public static SEX valueOf(java.lang.String);
    static {};
}

列舉的本質是一個類,所以列舉中還可以有成員變數,成員方法等。

public enum Sex {
    BOY(18), GIRL(16);

    public int age;

    Sex(int age) {
        this.age = age;
    }

    public void showAge() {
        System.out.println("年齡是: " + age);
    }
}

public class Demo03 {
    public static void main(String[] args) {
        Person p1 = new Person("張三", Sex.BOY);
        Person p2 = new Person("張三", Sex.GIRL);

        Sex.BOY.showAge();
        Sex.GIRL.showAge();
    }
}

執行效果:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-XSnn8X1V-1607883571004)(imgs/1566701678583.png)]

列舉的應用

列舉的作用:列舉通常可以用於做資訊的分類,如性別,方向,季度等。

列舉表示性別:

public enum Sex {
    MAIL, FEMAIL;
}

列舉表示方向:

public enum Orientation {
    UP, RIGHT, DOWN, LEFT;
}

列舉表示季度

public enum Season {
    SPRING, SUMMER, AUTUMN, WINTER;
}

列舉實現單例設計模式

  • 它不僅能避免多執行緒同步問題,而且還自動支援序列化機制,防止反序列化重新建立新的物件,絕對防止多次例項化。
  • 並且這種方式是Effective Java的作者Josh Bloch提倡的使用方式.
public enum Singleton {  
    INSTANCE;  
    public void whateverMethod() {  
    }  
}

相關文章