美文网首页
枚举和类

枚举和类

作者: 竹鼠不要中暑 | 来源:发表于2019-02-25 18:02 被阅读4次

枚举和类的异同

相同点:

  • 枚举类是一种特殊的类,它和普通的类一样,有自己的成员变量、成员方法、构造器。
  • 枚举类也可以实现一个或多个接口。

不同点

  • 枚举类的所有实例都必须放在第一行展示,不需使用new 关键字,不需显式调用构造器。自动添加public static final修饰。
  • 枚举类的构造器只能是私有的。
  • 使用enum定义、非抽象的枚举类默认使用final修饰,不可以被继承。
    可能有时候我们会想,也可以定义静态常量啊。按一般逻辑,Java会再定义一个枚举类,应该是有它的优点的。所以我们再从优缺点,来看看枚举类和常量类的异同。

枚举类的优点:

  • 枚举相对于常量类来说定义更简单,其不需要定义枚举值,而常量类中的每个常量必须要手动添加值。
  • 类型安全:枚举作为参数使用时可以在编译时避免弱类型错误,而常量类中的常量作为参数使用时在编译时无法避免弱类型错误。
    如:若一个方法中要求传入季节这个参数,用常量的话,形参就是int类型,我们会期望传入的参数在14之间,但是开发者传入任意类型的int类型值就行,但是如果是枚举类型的话,就只能传入枚举类中包含的对象。
    public static final int SEASON_SPRING = 1;
    public static final int SEASON_SUMMER = 2;
    public static final int SEASON_FALL = 3;
    public static final int SEASON_WINTER = 4;
  • 枚举自动具备内置方法(如values 方法可以获得所有值的集合来遍历),而常量类默认不具备这些方法。

枚举的缺点

  • 枚举的缺点就是不能被继承(编译后生成的类是 final class 的),也不能通过 extends 继承其他类(枚举类编译后实质就是继承了 Enum 类,Java 是单继承机制),但是定义的枚举类可以通过 implements 实现其他接口。
  • 枚举值定义完毕后除非修改重构,否则无法做扩展,而常量类可以随意继承。

看了枚举的优缺点,对于枚举的选择,简单来说,当一个类的对象是有限且固定的,或者说,我们想把常量值限定在指定范围内,如,四季,一周的七天等等,这时候,我们就可以考虑使用枚举。

例子

定义一个Season枚举类,其中第一行为四个季节的枚举值

public enum Season {
    SPRING("春天"), SUMMER("夏天"), FALL("秋天"), WINTER("冬天");

    private String season;

    Season(String season) {
        this.season = season;
    }

    @Override
    public String toString() {
        return this.season;
    }
}
public class Test {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        Season spring = Season.SPRING;
        System.out.println(spring.name() + ": " + spring.toString());
        for (Season season : Season.values()) {
            System.out.println(season.name() + ": " + season.toString());
        }
    }

输出:

SPRING: 春天
SPRING: 春天
SUMMER: 夏天
FALL: 秋天
WINTER: 冬天

另外,Java5新增了enum关键字,同时扩展了switch,Switch() 的参数可以接受枚举。如下:

    public static void judgeSeason(Season season) {
        switch (season) {
            case SPRING:
                System.out.println("春困");
                break;
            case SUMMER:
                System.out.println("夏乏");
                break;
            case FALL:
                System.out.println("秋盹");
                break;
            case WINTER:
                System.out.println("冬眠");
                break;
        }
    }

相关文章

  • Kotlin面向对象 (6)枚举类

    枚举类构造函数枚举常用属性和函数 kotlin 中使用 enum 和 class 两个关键词声明枚举类。 枚举类使...

  • java enum实现原理

    一、分析自定义枚举类 普通的枚举类和抽象枚举类相似,故直接分析抽象枚举类。 1. 编写一个抽象枚举类 2. 编译 ...

  • 枚举和类

    枚举和类的异同 相同点: 枚举类是一种特殊的类,它和普通的类一样,有自己的成员变量、成员方法、构造器。 枚举类也可...

  • 枚举

    枚举的本质是什么 枚举的本质就是一个类,这个类和普通类不同的地方在于有一个枚举项这些枚举项每一个都是一个枚举类的实...

  • 区分枚举类和类

    枚举类 概念: 用以存储一组有关联且有意义的常量的特殊数据类型 枚举类也是类,具有自己的成员变量和方法、构造器y ...

  • 枚举

    如何定义枚举类 什么枚举类:类里的对象是有限个,可以枚举出来 如何使用enum定义枚举类 枚举...

  • Java篇-枚举的使用

    一 : 自定义枚举类 枚举类调用 二 : 使用enum关键字定义枚举类 让枚举类实现接口: 可以让不同的枚举类的对...

  • 2.枚举类(Enum)

    1.枚举类 2.枚举类和普通类的区别 2.Enum的定义 3.带有构造方法的枚举 4.得到枚举值所有的数值 5.测...

  • 11Python的高级语法和用法

    11-1 枚举其实是一个类 11-2 枚举和普通类相比有什么优势 11-3 枚举类型、枚举名称与枚举值 11-4 ...

  • 枚举类和类的异同

    枚举类和类的异同 相同之处 枚举类也是类,同样具有成员变量、成员方法、构造器public enum Week { ...

网友评论

      本文标题:枚举和类

      本文链接:https://www.haomeiwen.com/subject/thbgyqtx.html