枚举

概念

枚举是一种特殊类。枚举是有固定实例个数的类型,我们可以把枚举理解成有固定个数实例的多例模式。

作用

一个方法接收的参数是固定范围之内的时候,那么即可使用枚举

枚举作用为限制输入的属性必须在所要求的范围之内,并且枚举只作为标记性作用,像一个flag一样

格式

enum 枚举名 {

第一行都是罗列枚举实例,这些枚举实例直接写大写名字即可。

}

入门案例

1.定义枚举:BOY表示男,GIRL表示女

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

2.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方法 
}

3.使用是 只能传入枚举中的固定值

public class Demo{
    psvm{
        Person p1 = new Person("张三",Sex.BOY);
        Person p2 = new Person("小红",Sex.GIRL);
        Person p3 = new Person("李四","abc");
    }
}

枚举本质是一个类,定义的Sex枚举最终效果如下

final class Sex extends java.lang.Enum<Sex> {
  public static final Sex BOY;
  public static final Sex GIRL;
  private static final Sex[] $VALUES;
  public static Sex[] values();
  public static Sex valueOf(java.lang.String);
  private Sex();
  static {};
}

枚举其他内容

枚举中也可以有成员变量,成员方法,构造方法(构造方法缺省权限就是private,不能定义其他非私有权限)也可以去实现接口。

代码演示:在Sex中加入年龄的成员变量,并定义构造方法成员方法。

package com.liqiliang.demo11_enum;

public class Demo {
    public static void main(String[] args) {
        Sex.BOY.run();//只要足够努力,幸运就会不期而遇!
        System.out.println(Sex.BOY.getAge());//20
    }
}

enum Sex implements Run{
    BOY(20),GIRL(22);
    //可以给枚举定义其他成分:成员变量,成员方法,构造方法
    //定义其他成分,必须在枚举常量后面

    //成员变量
    private int age;

    /*必须有无参构造,否则报错
      因为BOY,GIRL 本质上是对象,且调用枚举的无参构造
      但是如果有成员变量的话,调用的就是有参构造 BOY(1),GIRL(2);
      那么也可以没有无参构造器
    */
    private Sex(){

    }

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

    public int getAge() {
        return age;
    }

    // 枚举类中实现接口

    @Override
    public void run() {
        System.out.println("只要足够努力,幸运就会不期而遇!");
    }
}

interface Run{
    void run();
}

拓展

枚举只是只是作为标记性作用,如果希望一个枚举有具体的值应该怎么做? 下面是我自己想出来的办法 , 但是存在弊端 , 对象的第二个参数本该为枚举类 , 现在成了String字符串 , 所以严谨性待定

package com.liqiliang.demo10;

public class Demo {
    public static void main(String[] args) {
        Person person = new Person("小明", Sex.BOY.getSex());
        System.out.println(person);

        Person person1 = new Person("小红", Sex.GRIL.getSex());
        System.out.println(person1);

        /*
        Person{name='小明', sex='男'}
        Person{name='小红', sex='女'}
        */
    }
}

enum Sex{
    BOY("男"),GRIL("女");

    private String sex;

    Sex(String sex) {
        this.sex = sex;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }
}

class Person{
    private String name;
    private String sex;

    public Person(String name, String sex) {
        this.name = name;
        this.sex = sex;
    }

    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                '}';
    }
}

唯有努力,人生没有白走的路,每一步都算数