0
点赞
收藏
分享

微信扫一扫

java 开发规范

ivy吖 2022-03-12 阅读 68
java

目录

命名

常量

格式

面向对象

集合处理

控制语句

注释

异常

日志   

单元测试

MySQL开发规范

索引规约

SQL规约

对象关系映射(ORM)

安全规约


命名

  •  类名使用 UpperCamelCase 风格,遵从驼峰形式  (例:MarcoPolo) 
  •  方法名、参数名、成员变量、局部变量使用 lowerCamelCase 风格,遵从驼峰形式 (例:localValue )
  • 常量命名全部大写,单词间用下划线隔开
  • 抽象类命名使用 Abstract 或 Base 开头
  • 异常类命名使用 Exception 结尾
  • 测试类命名以它要测试的类的名称开始,以 Test 结尾
  • 枚举类名建议带上 Enum 后缀,枚举成员名称需要全大写,单词间用下划线隔开。
  • Service / DAO 层方法命名规约

    1 ) 获取单个对象的方法用 get 做前缀。

    2 ) 获取多个对象的方法用 list 做前缀(习惯:getXXXList)。

    3 ) 获取统计值的方法用 count 做前缀。

    4 ) 插入的方法用 save( 推荐 ) 或 insert 做前缀。

    5 ) 删除的方法用 remove( 推荐 ) 或 delete 做前缀。

    6 ) 修改的方法用 update 做前缀(或modify)。

常量

        不允许任何魔法值( 即未经定义的常量 ) 直接出现在代码中。

格式

        不同的业务逻辑之间或者不同的语义之间插入一个空行。相同业务逻辑和语义之间不需要插入空行。

面向对象

  •         所有的覆写方法,必须加@ Override 注
  •         Object 的 equals 方法容易抛空指针异常, 应使用常量或确定有值的对象来调用equals。例:” test ” .equals(object)
  •         构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。
  •         当一个类有多个构造方法,或者多个同名方法,这些方法应该按顺序放置在一起,便于阅读。
  •         类内方法定义顺序依次是:公有方法或保护方法 > 私有方法 > getter / setter方法。

集合处理

  •         集合初始化时,尽量指定集合初始值大小。ArrayList 尽量使用 ArrayList(int initialCapacity) 初始化。
  •         注意 Map 类集合 K/V 能不能存储 null 值的情况,如下表格:
集合类KeyValueSuper说明
Hashtable不允许为 null不允许为 nullDictionary线程安全
ConcurrentHashMap不允许为 null不允许为 nullAbstractMap分段锁技术
TreeMap不允许为 null允许为 nullAbstractMap线程不安全
HashMap允许为 null允许为 nullAbstractMap线程不安全

控制语句

  •         在一个 switch 块内,每个 case 要么通过 break/return 等来终止,要么注释说明程 序将继续执行到哪一个 case 为止;在一个 switch 块内, 都必须包含一个 default 语句并且 放在最后,即使它什么代码也没有。
  •         在 if/else/for/while/do 语句中 必须使用大括号,即使只有一行代码。
  •         推荐尽量少用 else, if-else 的方式可以改写成:     
   if(condition){
        …
      return obj; }

   // 接着写 else 的业务逻辑代码;

  •         除常用方法(如 getXxx/isXxx)等外,不要在条件判断中执行其它复杂的语句,将复 杂逻辑判断的结果赋值给一个有意义的布尔变量名,以提高可读性。

注释

  •         类、类属性、类方法的注释必须使用 Javadoc 规范,使用/**内容*/格式,不得使用 //xxx 方式。
  •         所有的抽象方法(包括接口中的方法)必须要用 Javadoc 注释、除了返回值、参数、 异常说明外,还必须指出该方法做什么事情,实现什么功能。
  •         所有的枚举类型字段必须要有注释,说明每个数据项的用途。

异常

  •         异常不要用来做流程控制,条件控制,因为异常的处理效率比条件分支低。
  •         不能在 finally 块中使用 return,finally 块中的 return 返回后方法结束执行,不 会再执行 try 块中的 return 语句。
  •         方法的返回值可以为 null,不强制返回空集合,或者空对象等, 必须添加注释充分 说明什么情况下会返回 null 值。
  •         防止空指针异常(NPE)             

                        1) 返回类型为包装数据类型,有可能是null,返回int值时注意判空。

                        反例:public int f(){ return Integer 对象}; 如果为 null,自动解箱抛 NPE。

                        2) 数据库的查询结果可能为null。

                        3) 集合里的元素即使isNotEmpty,取出的数据元素也可能为null。

                        4) 远程调用返回对象,一律要求进行NPE判断。

                        5) 对于Session中获取的数据,建议NPE检查,避免空指针。

                        6) 级联调用obj.getA().getB().getC();一连串调用,易产生NPE。

  •         避免出现重复的代码(Don’t Repeat Yourself),即DRY原则。

日志   

        应用中不可直接使用日志系统(Log4j、Logback)中的 API,而应依赖使用日志框架

SLF4J 中的 API,使用 门面模式的日志框架,有利于维护和各个类的日志处理方式统一。

单元测试

  •         好的单元测试必须遵守 AIR 原则(感觉像空气(AIR)一样并不存在)。宏观上来说,具有自动化、独立性、可重复执行的特点。
  •         单元测 试中不准使用 System.out 来进行人肉验证,必须使用 assert 来验证。
  •         编写单元测试代码遵守 BCDE 原则            

                         B:Border 边界值测试,包括循环边界、特殊取值、特殊时间点、数据顺序等。

                        C:Correct, 正确的输入,并得到预期的结果。

                        D:Design 与设计文档相结合,来编写单元测试。
                        E:Error 强制错误信息输入(如:非法数据、异常流程、非业务允许输入等),并得 到预期的结果。

MySQL开发规范

  •         表名、字段名必须使用小写字母或数字;(例:getter_admin,task_config,level3_name)
  •         小数类型为 decimal
  •         如果存储的字符串长度几乎相等,使用 char 定长字符串类型。
  •         表的命名最好是加上“业务名称_表的作用”。(例:tiger_task / tiger_reader / mpp_config)
  •         库名与应用名称尽量一致。
  •          字段允许适当冗余,以提高性能,但是必须考虑数据同步的情况。
  •         单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。
  •         合适的字符存储长度,不但节约数据库表空间、节约索引存储,更重要的是提升检 索速度。

索引规约

  •         业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。
  •         超过三个表禁止 join。需要 join 的字段,数据类型保持绝对一致;多表关联查询 时,保证被关联的字段需要有索引。

SQL规约

  •         数据订正时,删除和修改记录时,要先 select,避免出现误删除,确认无误才能执行更新语句。
  •         in 操作能避免则避免,若实在避免不了,需要仔细评估 in 后边的集合元素数量,控制在 1000 个之内。

对象关系映射(ORM)

  •         @Transactional 事务不要滥用。
  •         配置XML文件时注意SQL注入问题。

安全规约

  •         隶属于用户个人的页面或者功能必须进行权限控制校验。
  •         用户敏感数据禁止直接展示,必须对展示数据脱敏。
  •         用户输入的 SQL 参数严格使用参数绑定或者 METADATA 字段值限定,防止 SQL 注入, 禁止字符串拼接 SQL 访问数据库。
  •         用户请求传入的任何参数必须做有效性验证。

        参数校验包括:

                page size 过大导致内存溢出

                恶意 order by 导致数据库慢查询 

                任意重定向 

                SQL 注入

                反序列化注入

                正则输入源串拒绝服务 ReDoS 

  •         禁止向 HTML 页面输出未经安全过滤或未正确转义的用户数据。
  •         表单、AJAX 提交必须执行 CSRF (Cross-site request forgery)安全过滤。
  •         在使用平台资源,譬如短信、邮件、电话、下单、支付,必须实现正确的防重放限制, 如数量限制、疲劳度控制、验证码校验,避免被滥刷、资损。
  •         发贴、评论、发送即时消息等用户生成内容的场景必须实现防刷、文本内容违禁词过 滤等风控策略。

  参考地址:阿里开发规范(精简版)_shijunwang的博客-CSDN博客_开发规范 

举报

相关推荐

0 条评论