Java第十八次作业

1.1 概念


enum 的全称为 enumeration, 是 JDK 1.5 中引入的新特性。
在Java中,被 enum 关键字修饰的类型就是枚举类型。
如果枚举不添加任何方法,枚举值默认为从0开始的有序数值。
枚举的好处:可以将常量组织起来,统一进行管理。
枚举的典型应用场景:错误码、状态机等。
枚举除了不能继承,基本上可以将 enum 看做一个常规的类。

1.2 本质


尽管 enum 看起来像是一种新的数据类型,事实上,enum是一种受限制的类,并且具有自己的方法。
创建enum时,编译器会为你生成一个相关的类,这个类继承自 java.lang.Enum。
public abstract class Enum<E extends Enum<E>>
        implements Comparable<E>, Serializable { ... }

1.3 本方法


values():返回 enum 实例的数组,而且该数组中的元素严格保持在 enum 中声明时的顺序。
name():返回实例名。
ordinal():返回实例声明时的次序,从0开始。
getDeclaringClass():返回实例所属的 enum 类型。
equals() :判断是否为同一个对象。可以使用 == 来比较enum实例。
java.lang.Enum实现了Comparable和 Serializable 接口,所以也提供 compareTo() 方法。
 

常量项需求

        在系统中有一些变量它具有固定的取值范围,比如:学生类的性别属性包括男、女两个值、攀博课堂支付方式包括微信支付、支付宝支付、银联支付三种方式等,在程序中对这些取值通常用常量来表示,因为它们是固定在一定范围内的,如下代码是攀博课堂支付类中支付方式的的表示方式:

public class PbPayFactory {
 
    //微信支付类型
    public static final String weixinPayType = "weixin";//微信支付接口地址
    public static final String weixinPayurl ="https://api.mch.weixin.qq.com/pay/";
    //支付宝支付类型
    public static final String aliPayType = "ali";
    public static final String aliPayurl ="https://openapi.alipay.com/";
    //银联支付类型
    public static final String unionPayType = "union";
    public static final String unionPayurl ="https://gateway.95516.com/gateway/api/";
 
    //根据支付类型获取支付服务对象
    public static Pay getPay(String payType){
        Pay pay =null;
        switch(payType){
            case PbPayFactory.weixinPayType:
                //构造微信支付对象... 
                break;
            case PbPayFactory.aliPayType:
                //构造支付宝支付对象... 
                break;
            case PbPayFactory.unionPayType:
                //构造银联支付对象...
                break;
            default:
                break;
        }
        return pay;
    }
}

以上使用常量来表示支付方式相关的数据存在以下问题:
1、代码不够简洁
PbPayFactory类中光常量的配置都占据了近一半的代码量,不方便类阅读。

2、不能很好的对数据进行分类
支付类型和支付接口地址靠人工通过命名关联在一起容易出错,常量越多越不方便管理。
对于大型项目的开发类似的配置有很多,如果有一种简洁、分类配置常量的方式将会大大提高我们的生产效率。

枚举的妙用


2.1 枚举代替if else


这样当系统里有几十个角色时,那几十个 if/else嵌套可以说是非常酸爽了…… 这样一来非常不优雅,别人阅读起来很费劲;二来则是以后如果再复杂一点,或者想要再加条件的话不好扩展;而且代码一改,以前的老功能肯定还得重测,岂不疯了……
package Enum;
 

package Enum;

/**
 * @Author shu
 * @Date: 2022/02/10/ 20:24
 * @Description if - else 
 **/
public class JudgeRole
{
    public String judge(String roleName)
    {
        String result = "";
        if
        (roleName.equals("ROLE_ROOT_ADMIN")) {
            // 系统管理员有A权限
            result = "ROLE_ROOT_ADMIN: " + "has AAA permission";
        } else if
        (roleName.equals("ROLE_ORDER_ADMIN")) {
            // 订单管理员有B权限
            result = "ROLE_ORDER_ADMIN: " + "has BBB permission";
        }
        else if (roleName.equals("ROLE_NORMAL"))
        {
            // 普通用户有C权限
            result = "ROLE_NORMAL: " + "has CCC permission";
        }
        else
        { result = "XXX"; }
        return result;
    }

}

枚举类实现接口


枚举类型虽然不能继承其它类型但它可以实现一个或多个接口,这个在生产使用中较多。
1、接口

/**
*系统代码接口
*/ 
public interface SystemCode { 
    //系统代码 
    int getcode(); 
    //代码对应的描述 
    String getdesc();
}
public enum CodeEnum implements SystemCode {
 
    ERROR(-1,"系统异常"),
    FAILURE(0,"操作失败"),
    SUCCESSFUL(1,"操作成功"),
    LOGINSUCCESSFUL(100,"登录成功");
 
    private CodeEnum(int code,String desc) {
        this.code = code;
        this.desc = desc;
    }
    int code;//系统代码
    String desc;//代码对应的描述
 
    @Override
    public int getcode() {
        return code;
    }
 
    @Override
    public String getdesc() {
        return desc;
    }
 
    public static void main(String[] args) {
        System.out.println(CodeEnum.SUCCESSFUL.getcode());
        System.out.println(CodeEnum.SUCCESSFUL.getdesc());
//枚举项可以向上转型为接口类型
        SystemCode code=CodeEnum.SUCCESSFUL;
        System.out.println(code.getcode());
        System.out.println(code.getdesc());
    }
}

 

  • 枚举类
    package Enum;
    
    /**
     * @Author shu
     * @Date: 2022/02/10/ 20:23
     * @Description 角色接口
     **/
    public interface RoleOperation {
    
        String op();// 表示某个角色可以做哪些op操作
    }
    


    1)增强代码可读性

    2)传递参数错误

    3)去除equals两者判断 由于常量值地址唯一,使用枚举可以直接通过“==”进行两个值之间的对比,性能会有所提高。

    4)编译优势(与常量类相比)

    常量类编译时,常量被直接编译进二进制代码中,常量值在升级中变化后,需要重新编译引用常量的类,因为二进制代码中存放的是旧值。枚举类编译时,没有把常量值编译到代码中,即使常量值发生改变,也不会影响引用常量的类。

    5)修改优势(与常量类相比)

    枚举类编译后默认final class,不允许继承可防止被子类修改。常量类可被继承修改、增加字段等,易导致父类不兼容。

    6)枚举型可直接与数据库交互。

    7)Switch语句优势

    使用int、String类型switch时,当出现参数不确定的情况,偶尔会出现越界的现象,这样我们就需要做容错操作(if条件筛选等),使用枚举,编译期间限定类型,不允许发生越界。
     

package Enum;

/**
 * @Author shu
 * @Date: 2022/02/10/ 20:31
 * @Description
 **/
public enum RoleEnum implements RoleOperation
{
// 系统管理员(有A操作权限)
    ROLE_ROOT_ADMIN
        {
            @Override 
             public String op() {
                    return "ROLE_ROOT_ADMIN:" + " has AAA permission";
                }
            },
    
// 订单管理员(有B操作权限)
    ROLE_ORDER_ADMIN
            {
                @Override
                public String op() {
                    return "ROLE_ORDER_ADMIN:" + " has BBB permission";
                }
            },
    
    
// 普通用户(有C操作权限)
    ROLE_NORMAL
            {
                @Override
                public String op() {
                    return "ROLE_NORMAL:" + " has CCC permission";
                    
                }
            };

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值