eden-basic/03工程提示词/Java编码规范.md
2025-04-03 03:18:16 +00:00

13 KiB
Raw Blame History

JAVA 语言编码规范

4.1 命名规范

规则1.1(强制)

标识符由字母、数字、下划线和美元符($)组成,不能包含@、%和空格等特殊字符不能以下划线、数字或美元符号开始或结束不能是Java关键字区分大小写。

规则1.2(强制)

各种命名应使用正确的英文拼写和语法,避免拼音、混合拼写、不规范缩写、中文命名。

规则1.3(强制)

包名统一小写点分隔符间一个自然语义单词词意从大到小前缀顶级域名项目包名以com.psbc.开头。

规则1.4(强制)

类名使用UpperCamelCase命名方式简洁且富于描述。

规则1.5(建议)

抽象类命名建议Abstract开头异常类Exception结尾测试类Test结尾设计模式体现于类名。

规则1.6(强制)

方法名使用lowerCamelCase命名方式。

规则1.7(强制)

常量命名全大写,单词间下划线隔开,语义完整清楚。

规则1.8(建议)

布尔类型实例变量命名不使用is前缀。

规则1.9(强制)

参数名、实例变量、局部变量使用lowerCamelCase命名方式。

规则1.10(强制)

类型与中括号紧挨表示数组。

规则1.11(强制)

避免子父类成员变量、不同代码块局部变量相同命名。

规则1.12(建议)

自定义编程元素命名尽量完整单词组合。

规则1.13(建议)

常量、变量命名表示类型名词放词尾。

规则1.14(建议)

接口类方法、属性不加修饰符号简洁并加Javadoc注释接口少定义变量。

规则1.15(强制)

Service和DAO类基于SOA理念暴露服务是接口内部实现类用Impl后缀。

规则1.16(建议)

形容词接口名用形容词able结尾。

规则1.17(建议)

枚举类名带Enum后缀成员名称全大写单词间下划线隔开。

规则1.18(建议)

a) Service/DAO层方法命名 1获取单个对象用get前缀 2获取多个对象用list前缀复数结尾 3获取统计值用count前缀 4插入用save/insert前缀 5删除用remove/delete前缀 6修改用update前缀。 b) 领域模型命名: 1领域对象以xxxDO/DTO/VO命名 2避免以POJO结尾实体对象或值对象命名。

4.2 格式规范

规则2.1(强制)

源文件编码UTF-8Unix换行符。

规则2.2(建议)

除注释外方法签名等总行数不超过80行。

规则2.3(强制)

类文件组成部分顺序:文件头注释、包引入、类声明、常量、变量、构造函数、方法。

规则2.4(建议)

多个构造函数或同名方法应顺序在一起。

规则2.5(建议)

方法按功能而非作用域或访问权限分组。

规则2.6(强制)

引用类时禁止用*引入包全部类避免无用、重复引用不import java.lang和同包类。

规则2.7(强制)

Java关键字正确顺序public、protected、private、abstract、static、final、transient、volatile、synchronized、native。

规则2.8(建议)

避免多余关键字,接口方法属性不加修饰符号。

规则2.9(强制)

每行至多一条语句。

规则2.10(强制)

大括号使用约定: a左大括号前不换行 b左大括号后换行 c右大括号前换行 d右大括号后有else等代码不换行终止后必须换行 e大括号内为空简洁写成{},不换行。

规则2.11(建议)

缩进采用4个空格多行变量声明赋值不强制等号对齐tab设为4空格宽度。

规则2.12(建议)

单行字符数不超过120换行原则 a第二行相对第一行缩进4空格第三行起不再缩进 b运算符与下文换行 c点符号与下文换行 d方法调用参数多需换行时在逗号后换行 e括号前不换行。

规则2.13(建议)

用空行分隔逻辑相关代码段,提高可读性,不插入多个空行。

4.3 注释规范

规则3.1(建议)

类、属性、方法注释使用Javadoc格式。

规则3.2(强制)

公共API代码必须编写JavaDoc注释类、属性、方法、参数、返回值、异常全部注释。

4.4 常量变量

规则4.1(建议)

避免使用魔法数,应定义为常量。

规则4.2(强制)

长整型常量后使用大写字母“L”。

规则4.3(建议)

浮点数类型数值后缀统一为大写D或F。

规则4.4(建议)

按功能或模块归类常量。

规则4.5(建议)

常量复用层次分为五层:跨应用、应用内、子工程内、包内、类内。

规则4.6(建议)

变量值在固定范围变化时用enum类型。

规则4.7(强制)

每行只声明一个变量。

规则4.8(建议)

局部变量声明时初始化。

规则4.9(强制)

避免一个语句中给多个变量赋相同值,不用内嵌赋值运算符。

规则4.10(强制)

避免局部变量覆盖上一级变量。

规则4.11(强制)

数组类型变量声明采用数据类型[]的方式。

4.5 控制语句

规则5.1(强制)

switch括号内为String且为外部参数时先进行null判断。

规则5.2(强制)

每个switch语句包含default分支且default在最后。

规则5.3(强制)

if/else/for/while/do语句中必须使用大括号。

规则5.4(建议)

避免不可达的else if和else分支。

规则5.5(强制)

条件表达式尽量简化。

规则5.6(建议)

返回表达式尽量简化。

规则5.7(建议)

避免在循环中重复执行相同内容。

规则5.8(建议)

慎用非短路逻辑运算符。

规则5.9(建议)

含多种运算符的表达式中使用圆括号。

规则5.10(建议)

三元运算符前的表达式需加圆括号。

规则5.11(建议)

复杂条件判断结果赋值给布尔变量。

4.6 面向对象

规则6.1(强制)

禁止用类的实例对象引用访问静态变量或方法。

规则6.2(强制)

覆写方法必须加@Override注解。

规则6.3(强制)

覆写equals必须覆写hashCode。

规则6.4(建议)

过时接口或方法加@Deprecated注解。

规则6.5(建议)

避免使用过时类或方法。

规则6.6(建议)

慎用可变参数编程。

规则6.7(建议)

用常量或确定有值的对象调用equals。

规则6.8(建议)

参数个数相同的方法重载时,避免用自动转换类型,建议用不同方法名。

规则6.9(建议)

使用final关键字的情况 a不允许继承的类 b不允许修改引用的域对象 c不允许重写的方法 d不允许重新赋值的局部变量 e避免重复使用变量。

规则6.10(建议)

慎用Object的clone方法。

规则6.11(强制)

类成员变量访问控制从严。

规则6.12(建议)

类方法访问控制从严。

规则6.13(强制)

构造方法中避免处理业务逻辑初始化逻辑放init方法。

规则6.14(强制)

RPC方法返回值和参数用包装类型。

规则6.15(建议)

局部变量用基本类型。

规则6.16(建议)

POJO类不设定属性默认值。

规则6.17(强制)

POJO类必须写toString方法。

规则6.18(强制)

POJO类禁止同时存在isXxx和getXxx方法。

规则6.19(建议)

setter中参数名与成员变量名一致this.成员名=参数名。getter/setter中不加业务逻辑。

规则6.20(强制)

序列化类新增属性时不修改serialVersionUID不兼容升级时修改。

4.7 数值计算

规则7.1(强制)

比较字符串用equals不用==或!=。

规则7.2(强制)

避免自动类型转换导致溢出或精度丢失。

规则7.3(建议)

避免高精度转低精度溢出。

规则7.4(强制)

禁止用BigDecimal(double)构造用String构造或valueOf。

规则7.5(强制)

精确计算用BigDecimal不用浮点数。

规则7.6(强制)

与NaN比较用isNaN(),不用==或!=。

规则7.7(强制)

自增自减运算符使用要产生实际影响。

规则7.8(强制)

BigDecimal比较用compareTo不用equals。

规则7.9(强制)

SimpleDateFormat非线程安全不用在并发环境。JDK8及以上用DateTimeFormatter。

规则7.10(强制)

日期格式化Pattern统一规范。

规则7.11(建议)

三目运算符注意类型对齐可能引发空指针。

4.8 集合规范

规则8.1(建议)

慎用ArrayList.subList。

规则8.2(建议)

慎用Arrays.asList。

规则8.3(强制)

集合转数组用toArray(T[] array)传入长度为0的空数组。

规则8.4(强制)

禁止集合中添加自身。

规则8.5(强制)

foreach循环中不做remove/add操作用Iterator。

规则8.6(建议)

参照常用Map集合K/V存储null情况。

规则8.7(建议)

合理利用集合的有序性和稳定性。

规则8.8(强制)

集合明确泛型。

规则8.9(建议)

判断集合元素是否为空用isEmpty不用size()==0。

规则8.10(强制)

toMap()方法必须用带mergeFunction的。

规则8.11(强制)

toMap()方法中value为NULL时处理。

规则8.12(强制)

不可对keySet()/values()/entrySet()返回集合做增删。

规则8.13(强制)

排序时Comparator要满足三个条件。

4.9 线程安全

规则9.1(建议)

单例获取保证线程安全,推荐饿汉模式。

规则9.2(建议)

并发访问的单例禁止有状态成员变量。

规则9.3(建议)

创建线程或线程池指定有意义名称。

规则9.4(建议)

多个资源加锁保持一致顺序。

规则9.5(强制)

CountDownLatch使用确保countDown被执行。

规则9.6(强制)

锁在finally中释放。

规则9.7(强制)

同步代码中不用public属性。

规则9.8(强制)

占用锁时不调用Thread.sleep。

规则9.9(建议)

并发场景用线程安全集合。

规则9.10(强制)

线程资源通过线程池提供,不显式创建。

规则9.11(建议)

线程池用ThreadPoolExecutor不用Executors。

规则9.12(建议)

高并发避免用“等于”判断,用区间判断。

4.10 异常处理

规则10.1(强制)

可通过预检查避免的RuntimeException不捕获。

规则10.2(建议)

不用异常做流程控制。

规则10.3(建议)

finally中不使用return。

规则10.4(强制)

非稳定代码catch区分异常类型。

规则10.5(强制)

捕获异常要处理,不抛弃,最外层业务使用者处理异常。

规则10.6(强制)

try在事务代码中catch后手动回滚事务。

规则10.7(强制)

finally中关闭资源JDK7+用try-with-resources。

规则10.8(建议)

捕获与抛出异常类型匹配。

规则10.9(建议)

捕获异常区分Exception和Error。

4.11 日志规范

规则11.1(强制)

应用用日志框架SLF4JAPI不用直接用Log4j、Logback API。

规则11.2(强制)

禁止用System.out.print等方法用标准日志框架。

规则11.3(建议)

日志用占位符,不用“+”拼接。

规则11.4(建议)

日志级别分为FATAL、ERROR、WARN、INFO、DEBUG各级别使用建议。

规则11.5(建议)

info/debug日志进行开关判断。

规则11.6(强制)

日志中用户敏感信息脱敏。

规则11.7(建议)

日志打印参数中避免复杂表达式。

4.12 性能相关

规则13.1(建议)

同步调用优先用无锁数据结构,锁代码块尽可能小。

规则13.2(建议)

避免频繁创建可复用资源。

规则13.3(建议)

避免创建不必要的对象。

规则13.4(建议)

避免变量重复计算。

规则13.5(建议)

try/catch放在循环外层。

规则13.6(建议)

池化重量级资源。

规则13.7(建议)

遍历Map用entrySetJDK8+用Map.foreach。

规则13.8(建议)

用Set去重不用List的contains。

规则13.9(建议)

慎用递归,必须时保证出口可执行。

规则13.10(建议)

用观察者模式替换无限轮询。

规则13.11(建议)

缓存不常变化数据。

规则13.12(建议)

字符串拼接用StringBuilder或StringBuffer。

规则13.13(建议)

数组拷贝用System.arraycopy。

规则13.14(建议)

合理使用单例。

规则13.15(建议)

避免随意用静态变量。

规则13.16(建议)

未发生线程安全时用HashMap、ArrayList。

规则13.17(建议)

避免用二维数组。

规则13.18(建议)

合理使用线性表和链表。

规则13.19(建议)

避免非常大的内存分配。

规则13.20(建议)

正则表达式编译后复用。