Java 阿里命名以及注释规范
本页目录
个人经验
Controller层:全部使用包装类型!
Service层:全部使用包装类型!
Mapper层:返回值必须使用包装类型!
Pojo层:字段必须使用包装类型!
为什么使用包装类型,因为用户传参,可能会为null,数据库select的结果可能是null,即便数据库select的结果不是null,Pojo实际接收的字段,你无法保证是否为null!
如果需要参数校验,String类型必须使用StringUtils.isNotBlank(XXXX) 处理!
命名规范
- 包名:
- 全部小写
- 类名、接口名:
- 大驼峰AaaAaa
- 方法名、局部变量:
- 小驼峰 aaaAAA
- 成员变量:
- 小驼峰 aaaAAA
- 枚举
- 全部大写
其他场景
Abc的测试类命名为:AbcTest
包名在有且仅有一个正常语义单词的情况下,包名单数,类名复数含义可以使用复数
com.zanglikun.testDemo.util
其包下的类名建议用复数
StringUtils
不推荐使用尚未明确定义的值
String magicValue = "pilipala_" + account;不推荐的理由:比如账号是789pilipala_789 容易被写成pilipala789
long类型不允许使用小写l 必须使用大写L
Long timeStamp = 1L;反例:Long timeStamp = 1l; 这样定义容易被别人理解成11
注释规范
注释类型
- 单行注释 // 必须用于方法体上一行
- 多行注释 /* */ 常用于类名、方法名、类属性、接口 必须使用Javadoc规范,除了基本介绍参数、返回值信息,最好声明:方法是干什么的
- @see 用法
- todo 用法
/**
* @see #b()
* 请参考其他方法b Ctrl+ 鼠标左键点击即可
*/public void a(){}public void b(){// todo 这里需要做XXX逻辑}
单行注释:注释符与注释正文之间:有且只能有一个空格!
// 我是注释
反例://我是注释
接口、抽象类必须使用Javadoc文档规范,不得使用//
数组命名
推荐:int[] userList;
而不是 int userList[];
强转类型:右括号强制与转换至中间无空格
int account = 1234;
String magicValue = (String)abc;
IDEA设置:
- text file encoding 设置成UTF-8
- 文件换行符:设定为Unix,不要使用Windows
POJO类不要加is前缀:这里有些框架会引起序列化错误
// 定义一个变量,命名为:isDeletedprivate boolean isDeleted;// 然后 Alt + Insert 然后getter/setter一下public boolean isDeleted(){return isDeleted;}public void setDeleted(boolean deleted){this.isDeleted = deleted;}=================================================================// 再次定义一个变量,命名为:Deletedprivate boolean Deleted;// 然后 Alt + Insert 然后get set一下public boolean isDeleted(){return isDeleted;}public void setDeleted(boolean deleted){this.isDeleted = deleted;}对比发现,isXXX与XXX在定义成基本类型的时候,默认的属性名是:Deleted。
如果是包装类型 Boolean 则是正常getIsDeleted,与getDeleted
如果数据库表中有is_XXX,建议在mybatis <resultmap> 标签中进行配置。
OOP规约
避免通过类的对象去访问类的静态变量或者静态方法,直接使用类名. 即可
对象在堆中,类信息在方法区。
如果通过对象去访问静态变量:就需要获取对象的方法区,找到类信息,再去找到静态变量的值。
类名. 本身就在方法区,减少编译器的解析成本!
方法重写务必追加@Override,用于检测方法重写:不然无法准确是否是方法重写
方法参数尽量避免使用Object,作为参数类型:可以减少出现类型转换异常,
不建议开发者使用可变参数…编程
@Deprecated 过时 过期方法需要加入此注解
方法过期了,不推荐使用了,请使用@Deprecated注解,并详细建议的使用新方法XXX
同理,不建议使用过期的方法
equals:避免引用类型调用equals,避免出现 空指针异常
String iPhone = null;"abc".equals(iPhone); // 不会有问题iPhone.equals("abc"); // 会有空指针异常风险引入面试题
Integer a = 1;
Integer b = 1;
(a==b) // trueInteger a = 128;
Integer b = 128;
(a==b) // false
Idea Ctrl + 鼠标左键,Ctrl + F 搜索cache 找到
-128到127的单位内,使用的Integer是缓存的数据,此范围之外,才是new一个对象
货币类型:务必以最小的单位整形命名。 23章节
浮点型的等值比较:基本数据类型不能使用 == 包装数据类型不能使用equals()来判断,如下一条有说明
BigDecimal 等值强制使用compareTo()方法,而不是equals()方法,equals 方法会比较精度 ((1.0).equals(1.00) 就会报错
禁止使用构造方法 BigDecimal(duble)的方式将double转为BigDecimal对象,会有精度损失,而建议使用
BigDecimal g = new BigDecimal(string);
如:BigDecimal g = new BigDecimal("0.1");
因为BigDecimal的valueOf()是执行了Double的toString方法,所以valueOf也是能用的
BigDecimal g = BigDecimal.valueOf(0.1d);
定义数据类型DO 也就是与数据库对应的类型,属性类型,与字段类型要匹配
如果数据库字段money是bigint类型,创建Java类型字段不能使用
Integer money; // Integer范围大约是正负21亿,随着业务增长,java的Integer类型无法满足范围了
Long money; // 范围则会更一些。
所有POJO的数据类型务必使用包装类型,且使用时,务必保证NPE 也就是空指针异常的处理
所有的PRC方法的返回值必须使用包装类型
定义DO/DTO/VO/POJO不能设置默认值
比如日期字段:数据库查出来时空,你初始化了默认值,容易起业务争议
序列化类新增属性的时候,不要修改seriaVersionUID字段,避免反序列化失败。
构造方法,禁止写业务逻辑,如果有初始化逻辑,请自定义init()方法中
日期的正常格式 yyyy-MM-dd HH:mm:ss
M是月份
m是分钟
H是24小时进制
h是12小时进制
获取毫秒,务必使用System.currentTimeMillis(),而不是new Date.time()。创建对象,总归要慢一些。
程序不仅要写死一年时365天,避免公历闰年时出现日期转换错误
正确请使用:
// 获取今年的天数
int dayOfThisYear = LocalDate.now().lengthOfYear();// 获取某年的天数
LocalDate.of(2011,1,1).lengthOfYear();
集合
https://www.zanglikun.com/2301.html#face
判断集合是否时空,使用isEmpty(),而不是获取size再去判断==0的情况;
List集合转Map的方式,必须使用 下面方法,尚未补全P39
List
已跳过集合知识
线程
线程资源必须通过线程池提供,不允许应用自行显示创建线程。原因:创建大量线程导致OOM或内存切换导致性能下降。
创建线程,必须使用new ThreadPoolExecutor(…) 可以快速了解线程池的配置信息,需要复习本站的线程池知识
高并发时,能锁方法块,就不要锁完整方法体
加锁,加在try之外,释放锁必须在finally里面
控制语句
switch 务必追加 defult!
高并发情况下:使用 == 容易造成等于击穿的情况:比如奖品数量==0,然后返回。一旦==的判断值为复数,则后续的值,就跳过了奖品数量为0的判断了,建议使用>=0 或者<=0
前后端规范
后端接口必须使用Https
后端返回信息必须包含:1:Http状态码、2:错误码、3:错误信息、4:用户提示信息
后端返回给前端数字类型一律:String类型
Http请求:需要限制请求体Body大小。
前后端分页:要动态处理:规范分页参数有效
错误码
错误码:A0001与错误日志需要清晰明了
正确错误码:00000,必须传递
错误码由字母 + 4位编号组成。A代表用户错误、B服务端错误,C代表第三方错误。
错误码与错误信息不得反馈给用户!
异常日志
异常能提前避免,就提前避免:比如随便加些判断,避免空指针等情况
异常是为了处理,不是为了抛出去,必须有方法兜底去处理,不得被用户看到
事务控制中,如果自行catch了异常,请手动回滚事务
try 里面的return不会立即返回,必须finally走完,如果finally有return,则会抛弃try里面的
在调用RPC相关方法时,catch必须使用Throwable类来拦截
日志规约
使用日志框架,不要直接使用日志系统。推荐使用slf4j日志框架
日志文件建议保存15天。如:周一报错,其他时间不报错,就需要以周进行拦截与查看了。
对于网络运行状态、网络安全事件、个人敏感操作不少于6个月。国家规定
强烈推荐{} 占位符,因为字符串拼接使用append有性能损耗,占位符只是替换,性能更优
避免日志重复打印,务必在日志配置文件中设置additivity=false
生产环境禁止使用System.out或者 System.err 输出日志。
日志输出参数的时候,禁止使用JSON工具,因为JSON工具获取对象属性是get,如果get报错,那就麻烦了。推荐对象toString()
安全规约
用户敏感数据,必须要脱敏
防止SQL注入
防止XSS注入
用户传入任何参数都需要校验!
JAVA CSRF安全验证
对短信、右键等进行数量、疲劳、验证码校验。避免资源被滥刷
MySQL数据库
是否概念必须使用is_xxx命名unsigned tinyint 1表示是,0表示否。unsigned表示非负数
POJO类中任何与布尔类型的变量不得使用is前缀,使用mybatis中resultmap标签进行映射
主键命名pk_字段名,唯一索引名 uk_字段名,普通索引名idx_字段名
表必备按字段id,create_time,update_time
唯一索引是一定的约束
超过三张表禁止join,需要join字段数据类型绝对保持一直(避免索引失效),关联字段必须有索引
varchar建立索引必须指定长度,但不建议全部程度。这里建议百度一下!
不得使用左模糊、全模糊,如果有业务使用,使用搜索引擎
count(*) 与 count(1) 区别是 *会扫描null,但是1则查询非空的数量
不得使用外键
禁止使用存储过程
数据修改,一定要查一下,看一下是否是自己的要修改的
多表查询,必须使用别名
ORM映射
不得使用 * 作为查询的字段列表,容易引起与resultmap不一致。同时也会造成不必要的网络资源浪费,比如用不到的text的内容等等
任何返回必须定义一个ResultMap,不得直接返回Class
更新表记录时,必须更新对应的update_tiem字段为敌当前时间
不得使用HashMap或HashTable作为结果集返回。容易出现字段类型范围不匹配的问题
永久会员
Java 阿里命名以及注释规范相关推荐
- Java开发项目的命名规范+命名方法+注释规范
一.命名规范 变量Variable 变量名通常以小写字母 a-z 开头.如果变量名由多个单词构成,从第二个单词开始首字母需要大写 A-Z (小驼峰命名法).变量名中不建议使用下划线 _ 作为前缀或者单 ...
- java javadoc要求_javadoc注释规范
java中的注释,大家应该已经很熟悉了. 文档注释可以用于对类.属性.方法等进行说明.写文档注释时除了需要使用 /** .... */ 限定之外,还需要注意注释内部的一些细节问题. 1文档和文档注释的 ...
- Java 语法规定之外的命名注释规范
Java 语法规定之外的命名注释规范 命名规范 1. 项目名 2. 包名 3. 类名 4. 常量名 5. 变量名 6. 方法名 8. 其它命名技巧 9. 应当避免的行为 10. 经典的命名法 11. ...
- java里什么是注释,全面解析Java中的注解与注释
注解 一.什么是 Annotation? (注解 or 注释) Annotation, 准确的翻译应该是 -- 注解. 和注释的作用完全不一样. Annotation 是JDK5.0及以后版本引入的一 ...
- 关于java变量命名,介绍阿里JAVA命名规范及IDEA实时检测插件的使用以及CODELF取名神器
JAVA开发中,我们经常会为如何来命名烦心. 有大神曾说计算机科学的两件难事:缓存失效和命名 的确,程序员最头疼的事:命名 但其实,有规范可以遵循.还有工具帮我们取名,更有插件帮我们实时检查是否违反规 ...
- 【Java】命名规范
一.Java总体命名规范 类一般采用大驼峰命名,方法和局部变量使用小驼峰命名,而大写下划线命名通常是常量和枚举中使用. 创建一个项目之后,子类中的东西命名规范如下: 项目名全部小写,多个单词中间用-连 ...
- Java项目命名规范
2019独角兽企业重金招聘Python工程师标准>>> 一.命名规范 1. 项目名全部小写 2. 包名全部小写 3. 类名首字母大写,如果类名由多个单词组成,每个单词的首字母都要大写 ...
- 一文带你了解Java的命名规范!
在编程的世界里,每种语言都有自己的一些规范.下面,小千带你了解Java命名规范.对于程序员来说,如果想学好一门语言,如果想要自己写出来的代码能被他人轻易地读懂,深入的学习命名规范是非常必要的一件事情. ...
- java变量命名规则_浅谈JAVA开发规范与开发细节(上)
开发团队在开发过程中,由于每个人的开发习惯,以及对于技术的理解深浅程度不一,往往一个项目在开发过程中,代码的质量,代码的风格都不尽相似,所以有一份适合团队的代码规范是非常有必要的,而一个团队的代码规范 ...
最新文章
- python3 语言翻译相关库
- 公共闪存接口CFI在Flash Memory程序设计中的应用
- 计算机视觉与深度学习 | 基于多源传感器数据融合的动态场景SLAM研究
- Ubuntu 20.04 LTS/RTX30XX显卡 快速配置深度学习环境(一行命令)
- hadoop的HA高可用配置(没有搞完)
- 深度学习 相机标定_基于深度学习的多传感器标定
- 在成长中遇到的挫折事件对你的影响_多种语言环境中成长的宝宝,会影响说话早晚?其实没有想象的复杂...
- BZOJ 1646: [Usaco2007 Open]Catch That Cow
- Windows XP减肥法
- Servlet 开发【07】Servlet两种跳转
- [bzoj3527][Zjoi2014]力
- 本地数据库_干货|本地数据库调用的实现案例
- WLAN射频、信道与帧分类
- php cookbook怎么样,《PHP Cookbook》学习笔记(三)
- 虚拟机安装MySQL教程
- Bluetooth LE for iOS demo. LightBlue like demo.
- java编译找不到符号_java编译时找不到符号,怎么处理
- SoftEther 介绍
- android 来电播放铃声,android 播放来电铃声
- 原来这才是睿至大数据的业务拼图