网站首页 > 技术文章 正文
前言
这几年内参与了很多系统的开发,有B端,也有C端,有QPS1都难以保证的,也有QPS日常几十万的,从而也就接触了各式各类的代码风格。
这些代码中,最常见的一个坏习惯,就是特别喜欢定义一个笼统的常量类,然后不断地往里边堆积内容,后期变得十分混乱。其实有部分常量,是可以定义成一个枚举,后续维护起来,会清晰很多。
案例
我们很多业务,经常是有各种选项,每个选项对应不同的业务逻辑,就像前端的一个单选框一样。
例如某个业务,是白名单的才能使用,黑名单的不能使用,这个时候,我们就遇到了一些和常量相关的东西了。
常见的开发方案,是通过一个字段userType,来标识用户的身份,如1为白名单,0为黑名单。
1.定义常量类
针对上述的userType类型,定义2个常量,用于后续的变量判断中。
package com.example.springbootconstant.constant;
/**
* @author hongcunlin
*/
public class UserConstant {
/**
* 黑名单
*/
public static final Integer USER_TYPE_BLACK = 0;
/**
* 白名单
*/
public static final Integer USER_TYPE_WHITE = 1;
}
2.编写服务
我们的一些服务,只有白名单才能使用,其他人是无法使用的,于是有了如下的接口
package com.example.springbootconstant.service;
/**
* 用户服务
*
* @author hongcunlin
*/
public interface UserService {
/**
* 娱乐
*
* @param userType 用户类型
* @return 娱乐结果
*/
String play(Integer userType);
}
以及上述接口的实现
package com.example.springbootconstant.service.impl;
import com.example.springbootconstant.constant.UserConstant;
import com.example.springbootconstant.service.UserService;
import org.springframework.stereotype.Service;
/**
* 用户服务
*
* @author hongcunlin
*/
@Service
public class UserServiceImpl implements UserService {
@Override
public String play(Integer userType) {
// 只有白名单才能进入
if (UserConstant.USER_TYPE_WHITE.equals(userType)) {
return "OK";
}
return "NO";
}
}
这里重点来了,很多人就是喜欢这样的写法,其实还可以接受,毕竟没有使用魔法常量,即没有提取常量,直接硬编码到业务逻辑中。
但是这样的代码,还是有提升空间的,就是将常量类改造为一个枚举类。
优化
不同于定义一个常量类,我们针对用户类型,定义一个枚举,后续新增的用户类型,都可以在这里添加。
package com.example.springbootconstant.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
/**
* 用户类型枚举
*
* @author hongcunlin
*/
@Getter
@NoArgsConstructor
@AllArgsConstructor
public enum UserTypeEnum {
/**
* 黑名单
*/
BLACK(0, "黑名单"),
/**
* 白名单
*/
WHITE(1, "白名单");
/**
* 用户类型值
*/
private Integer value;
/**
* 用户类型说明
*/
private String desc;
}
而其他业务相关的常量,则另外新起枚举或类,这样就可以将业务归类处理了,维护起来也十分清晰。
2.编写服务
这里照旧和传统写一样,定义了一个接口
package com.example.springbootconstant.service;
/**
* 用户服务
*
* @author hongcunlin
*/
public interface UserService {
/**
* 娱乐
*
* @param userType 用户类型
* @return 娱乐结果
*/
String play(Integer userType);
}
只是实现的内容,我们通过枚举来进行内容比较。
package com.example.springbootconstant.service.impl;
import com.example.springbootconstant.constant.UserConstant;
import com.example.springbootconstant.enums.UserTypeEnum;
import com.example.springbootconstant.service.UserService;
import org.springframework.stereotype.Service;
/**
* 用户服务
*
* @author hongcunlin
*/
@Service
public class UserServiceImpl implements UserService {
@Override
public String play(Integer userType) {
// 只有白名单才能进入
// if (UserConstant.USER_TYPE_WHITE.equals(userType)) {
if (UserTypeEnum.WHITE.getValue().equals(userType)) {
return "OK";
}
return "NO";
}
}
逻辑显然比传统写法清晰了很多。
最后
本文通过一个很简单的例子,说明了项目开发中一个常见的不良习惯,以及对应的优化方案,虽然简单,但是问题十分泛滥,所以有必要提一下。后续笔者有空,将分享更多相关的内容。
猜你喜欢
- 2025-07-28 Spring异常处理 bug !!!同一份代码,结果却不一样?
- 2025-07-28 Netty 解码器深入分析:调用时机与继承关系
- 2025-07-28 用户中心——比如:腾讯的QQ账号可以登录到很多应用当中 02
- 2025-07-28 Java 设计模式之享元模式介绍(享元模式实例)
- 2025-07-28 跟我学Java基础(三):常量(java中常量怎么定义)
- 2025-07-28 简述final关键字的作用(简述使用final关键字的注意点)
- 2025-05-08 java2(JaVa2实用教程第6版Pdf)
- 2025-05-08 Java 类初始化顺序解析与高并发优化
- 2025-05-08 Java基本程序设计结构(上)(java程序设计的三种结构是什么)
- 2025-05-08 Java 阴历阳历转换(java转化日期格式)
- 08-02C|在一个结构体嵌套一个共用体实现一体多用
- 08-02C++中,常用的强制类型转换函数
- 08-02如何使用C语言编程实现一个推箱子游戏?技术核心和算法实现
- 08-02C++20 新特性(24):模板访问权限和typename的放宽
- 08-02C++零基础到工程实践
- 08-02[深度学习] Python人脸识别库face_recognition使用教程
- 08-02AI算法之怎么利用Python实现支持向量机SVM算法
- 08-02【机器学习】SVM支持向量机
- 1521℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 623℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 526℃MySQL service启动脚本浅析(r12笔记第59天)
- 492℃启用MySQL查询缓存(mysql8.0查询缓存)
- 491℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 479℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 460℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 458℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- cmd/c (90)
- c++中::是什么意思 (84)
- 标签用于 (71)
- 主键只能有一个吗 (77)
- c#console.writeline不显示 (95)
- pythoncase语句 (88)
- es6includes (74)
- sqlset (76)
- windowsscripthost (69)
- apt-getinstall-y (100)
- node_modules怎么生成 (87)
- chromepost (71)
- flexdirection (73)
- c++int转char (80)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- c语言min函数头文件 (68)
- asynccallback (71)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- java (73)
- js数组插入 (83)
- mac安装java (72)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)