枚举

本文探讨了在Java中如何处理有限枚举值的属性,例如学生的性别。通过比较三种不同的实现方式:逻辑判断、使用常量和使用枚举类型,分析了各自的优缺点。枚举类型提供了更安全、更具可读性的解决方案,并介绍了其在Java中的特性,如自动添加final和private修饰,以及枚举对象的name和ordinal属性。最后,枚举的使用场景被进一步阐述,例如用于表示有限数量的对象,如季节等。
摘要由CSDN通过智能技术生成

比如对于一个学生类,存在性别属性: (男,女)

他的值是有穷的,故我们可以列举出他的全部可能性:

下面是几种实现判断输入是否为男或女的方法:

第一种方式: setSex() 方法进行通过代码判断

 public void setSex(String sex) {
        //限制  通过逻辑代码实现
       if("男".equals(sex) ||"女".equals(sex)  ){
            this.sex = sex;
        }else{
            throw new RuntimeException("性别只能是男或者女,不能是:"+sex);
        }
    }

缺点:

1) 编写逻辑代码: if--else

2) 检查是在代码运行的时候,才会判断

第二种方式: 男,女作为一个常量, 要求给sex属性赋值, 把常量赋值给sex属性

public class Student {
    //定义男女的两个常量
    public static final String MAN = "男";
    public static final String  WOMAN = "女";
}
​
​
 stu.setSex(Student.MAN);

经验:

开发过程中, 善用常量: 避免"魔法数字" ,可读性

使用常量缺点:

1) 无法检查, 很弱的限制, 口头限制,代码无法限制

好处: 可读性高

第三种: 使用私有构造方法, 提供两个公开静态的本类对象, 显示这个类的对象个数

/**
 * 性别类,
 *   使用对象,   sex 只有 两个对象:  男的对象 ,女的对象
 */
public class Sex {
    //Sex定义两个常量, 本类的对象
    public static final Sex MAN = new Sex();
    public static final Sex WOMAN = new Sex();
​
    //私有的构造方法  表示这个构造方法只能在本类使用
    private Sex(){
​
    }
​
    //提供公开的静态方法, 调用本类的构造方法,创建一个对象,返回
    //public static  Sex createInstance(){
    //    return new Sex();
    //}
}

偷懒:

public static final 类 省略: MAN ,WOMAN MAN 等同于: public static final Sex MAN = new Sex();

构造方法默认就是private修饰

public enum Sex{

MAN,WOMAN

}

JDK 为了简化上面的代码. 提供 enum (枚举) , 还是一个类

/**
 * 枚举
 *   如果一个类的对象有限个数, 列举出来,使用枚举
 */
public enum SexEnum {

MAN("男"),WOMAN("女");

}
//提供了有参的构造方法  默认访问修饰符: private,只能是private
SexEnum(String value){
    this.value = value;
}

在测试类中:(注意不能new一个枚举的对象,因为它的构造方法为私有)

使用枚举类的方法:

1)重写学生类的构造方法:在new时完成初始化

代码如下:

学生类中:

public Student2(SexEnum sex) {
    this.sex = sex;
}

测试类中:

Student2 student2 = new Student2(MAN);

2)使用无参构造方法后用对象的set方法:

代码如下:

Student2 student2 = new Student2();
student2.setSex(MAN);

1.enum和class、interface的地位一样

2.使用enum定义的枚举类默认继承了java.lang.Enum,而不是继承Object类。枚举类可以实现一个或多个接口。

3.枚举类的所有实例都必须放在第一行展示,不需使用new 关键字,不需显式调用构造器。自动添加public static final修饰。

4.使用enum定义、非抽象的枚举类默认使用final修饰,不可以被继承。

5.枚举类的构造器只能是私有的。

枚举类的父类java.lang.Enum: 父类有两个属性:

1) name: 枚举的对象的名字, name() 获取对象名字

2) ordinal: 枚举对象下标 ordinal() 获取对象的下标

枚举使用场景: 某个类的对象有限个数, 需要列举出来, 可以使用枚举

比如: 季节类: 春夏秋冬 季节类定义枚举

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kblzxj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值