耗尽心血只为给小白全方位拆解 ———枚举类Ⅰ

前言:

因为这个枚举类在实际应用的场景特别广泛,而且任何一个系统(  不管什么类型不管大小,都需要使用枚举类  ),

由此可见,不管以后开发什么项目系统,软件还是小程序......掌握枚举类都是至关重要的!!!!

小编也打算分  2/3篇  文章才能完完全全,比较清晰条理的  拆解清楚  

这篇文章真的是集结了小编的心血啊

复杂的概念(①想方设法比喻生活场景,②能举栗子就配具体代码例子)全是干货。大家如果有收获给我一个 赞 或者点个 关注 ,我们以后一起进步!!!

一,枚举类概述:

枚举类型本质上也是一种类,只不过是这个类的对象是有限的、固定的几个,不能让 用户随意创建。

枚举类的例子举不胜举,在生活实际应用的场景也随处可见:

星期:Monday(星期一)......Sunday(星期天)

性别:Man(男)、Woman(女) 

 月份:January(1月)......December(12 月) 季节:Spring(春节)......Winter(冬天)

三原色:red(红色)、green(绿色)、blue(蓝色)

支付方式:Cash(现金)、WeChatPay(微信)、Alipay(支付宝)、 BankCard(银行卡)、CreditCard(信用卡)

就职状态:Busy(忙碌)、Free(空闲)、Vocation(休假)、Dimission(离职)

订单状态:Nonpayment(未付款)、Paid(已付款)、Fulfilled(已配货)、 Delivered(已发货)、Checked(已确认收货)、Return(退货)、Exchange (换货)、Cancel(取消)

若枚举只有一个对象, 则可以作为一种单例模式的实现方式。

枚举类是什么,通过举例,大家大致也清楚了。

二,枚举类的实现:

   –  在JDK5.0 之前,需要程序员自定义枚举类型。

   --  在JDK5.0 之后,Java支持enum关键字来快速定义枚举类型。

因为咱们以后使用的大多是jdk5.0以后的场景居多,

所以5.0之前的如何实现咱们就略讲,5.0之后的详细拆解。

2.1在JDK5.0 之前如何声明枚举类呢?

• 私有化类的构造器,保证不能在类的外部创建其对象

• 在类的内部创建枚举类的实例。声明为:public static final ,对外暴露这些 常量对象

• 对象如果有实例变量,应该声明为private final(建议,不是必须),并在构造 器中初始化

在JDK 5.0之前,Java并没有内置的枚举类型支持。因此,开发者通常会使用一个模式来模拟枚举的行为,这种模式被称为“Typesafe Enum Pattern”。这个模式通过创建一个私有构造函数的类,并且在这个类内部创建一系列public static final类型的对象来实现。

2.1.1举个栗子!!!!

public class Day {
    // 私有化构造器
    private Day(String name) {
        this.name = name;
    }

    // 实例变量,建议为private final
    private final String name;

    // 获取实例变量的方法
    public String getName() {
        return name;
    }

    // 在类的内部创建枚举类的实例,并声明为public static final
    public static final Day SUNDAY = new Day("Sunday");
    public static final Day MONDAY = new Day("Monday");
    public static final Day TUESDAY = new Day("Tuesday");
    public static final Day WEDNESDAY = new Day("Wednesday");
    public static final Day THURSDAY = new Day("Thursday");
    public static final Day FRIDAY = new Day("Friday");
    public static final Day SATURDAY = new Day("Saturday");

    // 重写toString方法,方便打印
    @Override
    public String toString() {
        return name;
    }
}

2.1.2代码解释和总结:

私有化构造器:Day类有一个私有的构造函数,这意味着除了Day类本身之外,其他任何类都无法创建Day的实例。这保证了Day类的实例只能是预先定义好的那些。


实例变量:name字段被声明为private final,意味着它只能在构造函数中初始化,并且一旦设置就不能再改变。这样做可以确保每个Day实例的状态都是不可变的(immutable),这是枚举的一个重要特性。


常量对象:我们为一周中的每一天创建了一个public static final类型的Day实例。这些实例可以在程序的其他部分作为常量使用,而不能被修改或重新赋值。


辅助方法:getName()方法允许外部代码获取Day实例的名字,而不直接访问其私有字段。toString()方法被覆写以便提供更有意义的字符串表示形式,当打印Day实例时会调用这个方法。

2.2定义枚举类(JDK5.0 之后)

2.2.1enum 关键字声明枚举

声明格式:

【修饰符】 enum 枚举类名{ 
常量对象列表 
} 
【修饰符】 enum 枚举类名{ 
常量对象列表; 
对象的实例变量列表; 
}

咱们举俩个例子:

展示如何声明  没有实例变量  和  有实例变量  的枚举类。

没有实例变量的枚举:
public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
}

// 使用示例
public class TestDayEnum {
    public static void main(String[] args) {
        Day today = Day.SATURDAY;
        System.out.println("Today is " + today);
    }
}

没有实例的例子中,

Day枚举只包含了一组表示一周中每一天的常量。每个常量都是Day类型的一个唯一实例,可以直接通过Day.SATURDAY这样的方式引用。

包含实例变量的枚举:


当我们需要为每个枚举常量添加额外的信息时,可以在枚举定义中声明实例变量,并提供一个构造函数来初始化这些变量。我们还可以为枚举添加方法来访问这些变量。

public enum Color {
    RED(255, 0, 0),
    GREEN(0, 255, 0),
    BLUE(0, 0, 255);

    // 实例变量
    private final int red;
    private final int green;
    private final int blue;

    // 枚举的私有构造函数
    private Color(int red, int green, int blue) {
        this.red = red;
        this.green = green;
        this.blue = blue;
    }

    // 获取RGB值的方法
    public String getRGB() {
        return "RGB(" + red + ", " + green + ", " + blue + ")";
    }

    // 重写toString方法,方便打印
    @Override
    public String toString() {
        return name() + " - " + getRGB();
    }
}

// 使用示例
public class TestColorEnum {
    public static void main(String[] args) {
        for (Color color : Color.values()) {
            System.out.println(color);
        }
    }
}

在包含实例变量的例子中:

①Color枚举包含了三个常量:RED、GREEN和BLUE,每个常量都有对应的RGB颜色值。


②枚举中的red、green和blue字段是private final类型的,意味着它们只能在构造函数中初始化,并且一旦设置就不能再改变。


③构造函数Color(int red, int green, int blue)是私有的,这意味着它只能在枚举内部使用,用于初始化枚举常量。


④getRGB()方法返回一个字符串,表示该枚举常量的颜色值。


⑤toString()方法被覆写以提供更友好的输出格式,当打印枚举常量时会调用这个方法。


⑥TestColorEnum类展示了一个简单的循环遍历所有枚举常量并打印它们的方式。

2.2.2enum 方式定义的要求和特点

概述与总结:咱们先都列出来,再一个一个做解释,举例子

• 枚举类的常量对象列表 必须在枚举类的首行 ,因为是常量,所以建议大写。

• 列出的实例 系统会自动添加 public static final 修饰。

• 如果常量对象列表后面没有其他代码,那么“;”可以省略,否则不可以省略“;”。

• 编译器给枚举类默认提供的是private的无参构造,如果枚举类需要的是无参构造, 就不需要声明,写常量对象列表时也不用加参数

• 如果枚举类需要的是有参构造,需要手动定义,有参构造的private可以省略,调用 有参构造的方法就是在常量对象名后面加(实参列表)就可以。

• 枚举类默认继承的是java.lang.Enum类,因此不能再继承其他的类型。

• JDK5.0 之后switch,提供支持枚举类型,case后面可以写枚举常量名,无需添加枚 举类作为限定。

1. 常量对象列表必须在枚举类的首行


解释:

当你定义一个枚举时,你首先需要列出所有的常量。这是因为这些常量是这个类型的所有可能值。

如果你有一个装有不同颜色球的盒子,那么你需要先知道盒子里有哪些颜色的球。同样地,在Java中,你需要先告诉编译器你的枚举可以有哪些值。

举栗子:

public enum Day {
    SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY;
}

2. 列出的实例系统会自动添加 public static final 修饰


解释:

当你在枚举中定义常量时,Java编译器会自动为它们加上public static final这几个关键字。这意味着这些常量是公开的(任何地方都可以访问)、静态的(属于类本身,不是类的实例)和不可变的(一旦创建就不能改变)。这就像说,“这里有一组固定的、永远不变的颜色”。

例子:这个举不出什么例子,因为这是编译器自动处理的。(大家自己多联系一下就ok了)

3. 如果常量对象列表后面没有其他代码,那么“;”可以省略


解释:

如果枚举只包含常量而没有其他方法或字段,你可以省略末尾的分号。

但是,如果有其他的代码(如方法或字段),你就必须加上分号来结束常量列表。这就好比写完一封信后要画上句号一样。

无其他代码的情况:

public enum Season {
    SPRING, SUMMER, AUTUMN, WINTER // 分号可以省略
}

 

 

有其他代码的情况:

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

    public String getDescription() {
        return "A season of the year.";
    }
}

4. 编译器默认提供的是私有的无参构造:


解释:

如果你不自己定义构造函数,Java会为你提供一个私有的无参构造函数。这意味着你可以创建枚举常量而不传递任何参数。如果你只需要简单地列举一些值,比如星期几或季节,这通常就足够了。

举个栗子:

public enum Planet {
    MERCURY, VENUS, EARTH, MARS, JUPITER, SATURN, URANUS, NEPTUNE;
}

5. 如果需要有参构造,需手动定义


解释:

如果你想给每个枚举常量附加一些信息(例如颜色的RGB值),你需要定义一个带参数的构造函数。

然后在定义枚举常量时,你可以传递这些参数。

构造函数可以是私有的,也可以省略private关键字,因为它默认就是私有的。

举个栗子:

public enum Color {
    RED(255, 0, 0),
    GREEN(0, 255, 0),
    BLUE(0, 0, 255);

    private final int red;
    private final int green;
    private final int blue;

    Color(int red, int green, int blue) {
        this.red = red;
        this.green = green;
        this.blue = blue;
    }

    @Override
    public String toString() {
        return "RGB(" + red + ", " + green + ", " + blue + ")";
    }
}

6. 枚举类默认继承的是 java.lang.Enum 类;


解释:

所有枚举都隐式地继承自java.lang.Enum类,因此它们不能再继承其他类。

这是因为Java不允许多重继承(即一个类不能同时继承多个父类)。不过,枚举可以实现接口。

例子:这个举不了例子吧,因为这是Java语言的规定的。

7. JDK 5.0之后switch支持枚举类型:


解释:

从JDK 5.0开始,switch语句可以直接使用枚举类型作为表达式,并且在case标签中直接写枚举常量名,而不需要加枚举类名作为前缀。这使得代码更简洁易读。

举个栗子:

public class TestDayEnum {
    public static void main(String[] args) {
        Day today = Day.SATURDAY;

        switch (today) {
            case SUNDAY:
                System.out.println("Today is Sunday.");
                break;
            case MONDAY:
                System.out.println("Today is Monday.");
                break;
            case TUESDAY:
                System.out.println("Today is Tuesday.");
                break;
            case WEDNESDAY:
                System.out.println("Today is Wednesday.");
                break;
            case THURSDAY:
                System.out.println("Today is Thursday.");
                break;
            case FRIDAY:
                System.out.println("Today is Friday.");
                break;
            case SATURDAY:
                System.out.println("Today is Saturday.");
                break;
        }
    }
}

enum 中常用方法

---------今天小编先讲到这里,后续细节,我们下次继续!!!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值