java中的枚举类型指的是什么啊?

Python013

java中的枚举类型指的是什么啊?,第1张

在Java中,枚举类型本质上其实就是一个类,枚举中的常量都是该枚举类型的实例。虽然枚举类型有一些限制,比如不能再派生出子枚举类型,不能调用构造函数,不过我们仍然可以在枚举类型中定义构造函数、字段和方法

Java语言中的枚举类型的使用方法如下:

用法一:常量;

public enum Color {  

  RED, GREEN, BLANK, YELLOW  

}

用法二:switch;

 enum Signal {

        GREEN, YELLOW, RED

    }

    public class TrafficLight {

        Signal color = Signal.RED

        public void change() {

            switch (color) {

            case RED:

                color = Signal.GREEN

                break

            case YELLOW:

                color = Signal.RED

                break

            case GREEN:

                color = Signal.YELLOW

                break

            }

        }

    }

用法三:向枚举中添加新方法;

public enum Color {

        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4)

        // 成员变量

        private String name

        private int index

        // 构造方法

        private Color(String name, int index) {

            this.name = name

            this.index = index

        }

        // 普通方法

        public static String getName(int index) {

            for (Color c : Color.values()) {

                if (c.getIndex() == index) {

                    return c.name

                }

            }

            return null

        }

        // get set 方法

        public String getName() {

            return name

        }

        public void setName(String name) {

            this.name = name

        }

        public int getIndex() {

            return index

        }

        public void setIndex(int index) {

            this.index = index

        }

    }

用法四:覆盖枚举的方法;

public class Test {

    public enum Color {

        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4)

        // 成员变量

        private String name

        private int index

        // 构造方法

        private Color(String name, int index) {

            this.name = name

            this.index = index

        }

        // 覆盖方法

        @Override

        public String toString() {

            return this.index + "_" + this.name

        }

    }

    public static void main(String[] args) {

        System.out.println(Color.RED.toString())

    }

}

用法五:实现接口;

public interface Behaviour {

        void print()

        String getInfo()

    }

    public enum Color implements Behaviour {

        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4)

        // 成员变量

        private String name

        private int index

        // 构造方法

        private Color(String name, int index) {

            this.name = name

            this.index = index

        }

        // 接口方法

        @Override

        public String getInfo() {

            return this.name

        }

        // 接口方法

        @Override

        public void print() {

            System.out.println(this.index + ":" + this.name)

        }

    }

用法六:使用接口组织枚举。

public interface Food {

    enum Coffee implements Food {

      BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO

   }

  enum Dessert implements Food {

      FRUIT, CAKE, GELATO

  }

}

以上就是Java语言中枚举类型的基本使用方法。

Enum作为Sun全新引进的一个关键字,看起来很象是特殊的class, 它也可以有自己的变量,可以定义自己的方法,可以实现一个或者多个接口。当我们在声明一个enum类型时,我们应该注意到enum类型有如下的一些特征。

1.它不能有public的构造函数,这样做可以保证客户代码没有办法新建一个enum的实例。

2.所有枚举值都是public , static , final的。注意这一点只是针对于枚举值,我们可以和在普通类里面定义变量一样定义其它任何类型的非枚举变量,这些变量可以用任何你想用的修饰符。

3.Enum默认实现了java.lang.Comparable接口。

4.Enum覆载了了toString方法,因此我们如果调用Color.Blue.toString()默认返回字符串”Blue”.

5.Enum提供了一个valueOf方法,这个方法和toString方法是相对应的。调用valueOf(“Blue”)将返回Color.Blue.因此我们在自己重写toString方法的时候就要注意到这一点,一把来说应该相对应地重写valueOf方法。

6.Enum还提供了values方法,这个方法使你能够方便的遍历所有的枚举值。

7.Enum还有一个oridinal的方法,这个方法返回枚举值在枚举类种的顺序,这个顺序根据枚举值声明的顺序而定,这里Color.Red.ordinal()返回0。

1.遍历所有有枚举值. 知道了有values方法,我们可以轻车熟路地用ForEach循环来遍历了枚举值了。

for (Color c: Color.values())

System.out.println(“find value:” + c)

2.在enum中定义方法和变量,比如我们可以为Color增加一个方法随机返回一个颜色。

public enum Color {

Red,

Green,

Blue

private static int number = Color.values().length

public static Color getRandomColor(){

long random = System.currentTimeMillis() % number

switch ((int) random){

case 0:

return Color.Red

case 1:

return Color.Green

case 2:

return Color.Blue

default : return Color.Red

}

}

}

可以看出这在枚举类型里定义变量和方法和在普通类里面定义方法和变量没有什么区别。唯一要注意的只是变量和方法定义必须放在所有枚举值定义的后面,否则编译器会给出一个错误。

3.覆载(Override)toString, valueOf方法。

前面我们已经知道enum提供了toString,valueOf等方法,很多时候我们都需要覆载默认的toString方法,那么对于enum我们怎么做呢。其实这和覆载一个普通class的toString方法没有什么区别。

….

public String toString(){

switch (this){

case Red:

return "Color.Red"

case Green:

return "Color.Green"

case Blue:

return "Color.Blue"

default:

return "Unknow Color"

}

}

….

这时我们可以看到,此时再用前面的遍历代码打印出来的是

Color.Red

Color.Green

Color.Blue

而不是

Red

Green

Blue.

可以看到toString确实是被覆载了。一般来说在覆载toString的时候我们同时也应该覆载valueOf方法,以保持它们相互的一致性。

4.使用构造函数。

虽然enum不可以有public的构造函数,但是我们还是可以定义private的构造函数,在enum内部使用。还是用Color这个例子。

public enum Color {

Red("This is Red"),

Green("This is Green"),

Blue("This is Blue")

private String desc

Color(String desc){

this.desc = desc

}

public String getDesc(){

return this.desc

}

}

这里我们为每一个颜色提供了一个说明信息

public enum Color {

Red {

public String toString(){

return "Color.Red"

}

},

Green {

public String toString(){

return "Color.Green"

}

},

Blue{

public String toString(){

return "Color.Blue"

}

}

}

, 然后定义了一个构造函数接受这个说明信息。

要注意这里构造函数不能为public或者protected, 从而保证构造函数只能在内部使用,客户代码不能new一个枚举值的实例出来。这也是完全符合情理的,因为我们知道枚举值是public static final的常量而已。

5.实现特定的接口

我们已经知道enum可以定义变量和方法,它要实现一个接口也和普通class实现一个接口一样,这里就不作示例了。

6.定义枚举值自己的方法。

前面我们看到可以为enum定义一些方法,其实我们甚至可以为每一个枚举值定义方法。这样,我们前面覆载 toString的例子可以被改写成这样。

从逻辑上来说这样比原先提供一个“全局“的toString方法要清晰一些。

总的来说,enum作为一个全新定义的类型,是希望能够帮助程序员写出的代码更加简单易懂,个人觉得一般也不需要过多的使用enum的一些高级特性,否则就和简单易懂的初衷想违背了。