前言:
因为这个枚举类在实际应用的场景特别广泛,而且任何一个系统( 不管什么类型不管大小,都需要使用枚举类 ),
由此可见,不管以后开发什么项目系统,软件还是小程序......掌握枚举类都是至关重要的!!!!
小编也打算分 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 中常用方法
---------今天小编先讲到这里,后续细节,我们下次继续!!!!!