JAVA Coding 规范

news2024/12/28 3:59:33

Coding 规范

文章目录

    • Coding 规范
    • 一.文件规范
      • 1.1 声明
      • 1.2 缩进
      • 1.3 空行
      • 1.4 空格
      • 1.5 对齐
      • 1.6 小括号
      • 1.7 花括号
      • 1.8 代码长度
    • 二.命名规范
      • 2.1 命名总则
      • 2.2 命名空间
      • 2.3 类与接口
      • 2.4 方法命名
      • 2.5 属性命名
      • 2.6 常量命名
      • 2.7 变量命名
    • 三.语句规范
      • 3.1 语句总则
      • 3.2 循环语句
      • 3.3 Switch-case
    • 四.编码格式
    • 五.开发技巧

一.文件规范

1.1 声明

每行只能声明一个变量,如:

// indentation level int level;

// size of table
int size;

禁止

int level, size;

1.2 缩进

  • 每个缩进单位为4个英文空格,不要在代码中使用Tab字符,可以在开发工具中将tab键设置为4个字符,idea设置方式如下

在这里插入图片描述

  • 按层级缩进,缩进层级不能超过5层,否则需要拆分函数

1.3 空行

使用一个空行情况:

  • 两个方法之间
  • 方法内的局部变量和方法的第一条语句之间
  • 块注释或单行注释之前
  • 一个方法内的两个逻辑段之间,用以提高可读性

两个空行使用情况:

  • 一个源文件的两个片段(section)之间
  • 类声明和接口声明之间

1.4 空格

需要增加空格的地方有:

情形** 示例**
在大多数运算符之前和之后if (a + b > c)
“(” 的前面例如:if ((a > b) && (c > d)) 不要写成 if((a>b)&&(c> d))
|, &,||,&& 前后if ((a > b) && (c > d))
“=” 前后a = 100;
三元操作符 ? : 的前后maxValue = a>b ? a : b;
函数调用的各个参数之间getData(param1, param2, param3);
比较符前后a > b
case 的后面case “none”
语句表达式之间for (expr1; expr2; expr3)

1.5 对齐

  1. 当方法参数过多时当在每个参数后(逗号后)换行并对齐。
  2. 当控制或循环中的条件比较长时当换行(操作符前)、对齐并注释各条件。
  3. 变量定义最好通过添加空格形成对齐,同一类型的变量应放在一起。

1.6 小括号

  • 多个条件判断时,推荐增加小括号增加可读性

例如:

if (((a - b) << 2) > ((c - d) >> 4)) {
// do…
}

  • 尽量不要在返回语句中使用()

1.7 花括号

  • {} 中的语句应该单独作为一行左

  • 括号"{“当紧跟其语句后(即:在它后面换行),右括号”}"永远单独作为一行且与其匹配行对齐,并尽量在其后说明其匹配的功能模块。如:

    public String getFirstNode (List<String> nodeList) {
        if (nodeList != null && nodeList.size() > 0) {
            return nodeList.get(0);
        } else {
            return null;
        }
    }
    

1.8 代码长度

  1. 单个方法的有效代码长度当尽量控制在100行以内(不包括注释行)
  2. 单个类的长度包括注释行不超过1500行。

二.命名规范

Pascal命名法:每个单词的首字母都大写。如:BackColor

Camel 命名法(驼峰命名法):首字母小写,后面每个单词的首字母都大写。如:backColor

Underline 命名法(下划线命名法):单词中间用下划线分割。如:string user_name;

2.1 命名总则

  1. 使用可以准确说明变量/字段/类/接口/包等的完整的英文描述符。例如,采用类似firstName,listAllUsers这样的名字,严禁使用汉语拼音及不相关单词命名。
  2. 采用该领域的术语。如果用户称他们的"客户" (clients) 为"顾客" (customers),那么就采用术语 Customer 来命名这个类,而不用 Client。
  3. 尽量少用缩写,但如果一定要使用,当使用公共缩写和习惯缩写等,如实现(implement)可缩写成impl,严禁滥用缩写。
  4. 避免使用长名字(最好不超过 25 个字母)。
  5. 避免使用相似或者仅在大小写上有区别的名字。
  6. 避免使用数字,如:map2map。
  7. 命名时应使用复数来表示它们代表多值,如:orderItems。

2.2 命名空间

  1. Java文件名所有单词首字母大写。
  2. 包名一般以项目或模块名命名,少用缩写和长名,一律小写。
  3. 不要用java, javax作为自定义包的前缀

2.3 类与接口

  • 类的名字必须由大写字母开头而其他字母都小写的单词组成,对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母,一般使用名词命名。
  • 接口的第一个字符用"I"开头,Service结尾,实现类的命名统一以"ServiceImpl"结尾。

2.4 方法命名

  1. 方法命名多为动词结构

  2. 采用有符合问题域意义的单词或单词组合。第一个单词常用一个动词,采用小写,后续的每个单词采用首字母大写,其余小写(特殊字除外如URL),没有特别理由不用下划线作为分隔符

  3. 在Java中对属性方法命名遵循JavaBean的标准:
    getter,setter方法:最好使用@Data注解

  4. 构造方法的命名与类名一致

  5. 取值使用get前缀,设值使用set前缀,判断类使用is(has)前缀,查询类使用query或find前缀(不建议get),修改类使用modify前缀(不建议update),删除类使用delete前缀。例:

    getName() 
    setSarry() 
    isLogon() 
    queryUserCount()                                                       
    modifyUserInfo() 
    deleteUser()
        
    findByXXX()//获取单条记录的
    listByXXX()//获取List集合的
    pageXXX()//分页查询的
    

2.5 属性命名

  1. javabean属性命名尽量使用常规的驼峰式命名规则
  2. 属性名第一个单词尽量避免使用一个字母:如eBook, eMail。
  3. boolean属性名避免使用 “is” 开头的名称,因为javabean规范的boolean取值操作是isXXX

2.6 常量命名

  1. 采用完整的英文大写单词,在词与词之间用下划线连接,如:DEFAULT_VALUE
  2. 命名尽量简短,不要超过16个字符
  3. 同一组的常量可以用常量类封装在一起,便于引用和维护

2.7 变量命名

  1. 变量的命名包括实例变量,静态变量,函数参数的命名。

  2. 变量的名字必须小写字母开头,后面的单词用大写字母开头,其余小写(特殊单词除外,如URL)

  3. 对不易清楚识别出该变量类型的变量应使用类型缩写作其前缀,如字符串使用strXXX,boolean使用isXXX,hasXXX等等。

  4. 命名尽量简短,不要超过16个字符

  5. 除了生命周期很短的临时变量外,避免采用单字符作为变量名,实例变量的命名不要用单字符。常用的单字符变量如整型用 i、j、 k、 m、 n字符型用c、d、 e,坐标用x、y、z。

  6. 不要用a、b、c、i、j、n等没有意义的变量命名;

  7. 不要怕麻烦,要使用带有意义的单词命名,如:userListSize、rowLength等来命名。

  8. 集合命名

    • 用名词加集合名称的方式来命名,第一个单词首字母小写,如:

      List<User> userList = new ArrayList<User>(); 
      Map<String, User> userMap = new HashMap<String, User>();           
      
    • 禁止使用单个字母如l,m来命名。

三.语句规范

3.1 语句总则

  1. 统一使用IDEA格式化工具进行格式化,默认快捷键:Ctrl+ALT+L

  2. 尽量避免强制类型转换。如果不得不做类型转换,尽量用显式方式。

  3. If else 中的业务代码行数太长,否则就要考虑用函数封装

  4. 避免在表达式中用赋值语句

  5. 避免对浮点类型做等于或不等于判断

  6. 杜绝魔法数字, for循环的最大数等也要用变量代替,以便知道是什么含义

  7. 对象比较运算,常量放在前面,比如"aaa".equals(str)

  8. Boolean的"假"判断格式:if(false==isMax) 而不用if(!isMax),因为非符号"!"不清晰

  9. 如果一段带有业务逻辑的代码超过两次用到,就将其封装成一个方法

  10. 单个循环也要用{}

  11. 每个变量仅有一个唯一的用途

  12. 单个函数执行单个功能并与其命名相符

  13. 常数变量声明为final

  14. 每个if-else if-else语句都有最后一个else以确保处理了全集

  15. 对于流操作代码的异常捕获有finally操作以关闭流对象,比如:

    /** 
    * desktop的Ajax删除处理 
    * @return null 
      */ 
    public String ajaxDelete() {                                               PrintWriter out = null; 
        try { 
            out = response.getWriter(); 
            deleteModel(); 
            out.write("{success:true}"); 
        } catch (Exception e) { 
            if (out != null) { 
                out.write("{success:false}"); 
            } 
        } finally { 
            if (out != null) { 
                out.close(); 
            } 
        } 
        return null; 
    }
    
  16. 对同步对象的遍历访问必须进行代码同步处理

  17. 在对Map对象使用迭代遍历过程中保证没有做增减元素操作

  18. If else判断语句避免头重脚轻,比如if的代码段过大,else的代码很短,这时候要调整结构

  19. 每一行最多包含一条语句。

3.2 循环语句

  1. 务必检查,杜绝死循环
  2. 即使循环体只有一条语句,也要用花括号括起
  3. 尽量不用空语句,特殊情况用到空语句,写好注释,告诉读者这不是bug
  4. 循环中禁止使用访问数据库的操作,循环内部如果需与数据库交互,而应提前一次性读取出。(重点注意)

3.3 Switch-case

  1. 语句switch中的每个case各占一行。

  2. 所有的非空 case 语句必须用 break; 语句结束。例:

    switch (score) {                                                           case 1: 
            str = "good"; 
            break; 
        case 2: 
            str = "bad"; 
            break; 
        default: 
            str = "nothing"; 
            break; 
    }
    
  3. 语句switch中的case按字母顺序排列。

  4. 为所有switch语句提供default分支。

四.编码格式

  1. 一个程序文件最好不要超过1000行
  2. 尽可能缩小对象的作用域,这样对象的可见范围和生存期也都会尽可能地小
  3. 一个方法所完成的功能要单一,不同的功能封装为不同的方法.
  4. 如果对象在某个特定范围内必须被清理(而不是作为垃圾被回收),请使用带有finally子句的try块,在finally子句中进行清理。
  5. 在处理可变String的时候要必须使用StringBuffer类,可变范围在5次以内可以使用String
  6. 使用java标准库提供的容器。优先选择ArrayList来处理顺序结构,选择HashSet来处理集合,选择HashMap来处理关联数组,选择linkedList来处理堆栈和队列。当使用前三个的时候,应该把他们向上转型为List、Set和Map,这样就可以在必要的时候以其它方式实现
  7. 如果数组的长度将来可能突破现有定义,就用ArryList。
  8. 尽量使用"private"、"protected"关键字,这样对改动影响最小,必要时再定义为public。
  9. 采用类而不是对象引用静态变量和方法
  10. 使用Boolean必须采用Boolean.TRUE/Boolean.FALSE进行构造
    Boolean.valueof(true|false|y|n|Y|N)的形式进行构造
  11. 方法参数尽量控制在5个以内,参数过多可封装成对象,以提高程序的可读性和可扩展性,参数分隔符后保持一个空格。
  12. 禁用System.out.println()进行调试信息的输出,而采用统一slf4j

五.开发技巧

  1. 当API会面对不可知的调用者时,方法需要对输入参数进行校验,如不符合则抛出IllegalArgumentException 。
  2. 在数组中的元素(如String [1]),如果不再使用需要设为NULL,避免内存泄漏。因此直接用Collections类而不要使用数组。
  3. 在不需要封闭修改的时候,尽量使用protected 而不是 private,方便子类重载。
  4. 变量,参数和返回值定义尽量基于接口而不是具体实现类,如Map map = new HashMap();
  5. 和金额相关时,使用BigDecimal,而不是float
  6. 异常要么处理,要么抛出,不允许空的catch块。
  7. 重载方法必须使用@Override,可避免父类方法改变时导致重载函数失效。
  8. 不需要关心的warning信息可以用@SuppressWarnings(“unused”), @SuppressWarnings(“unchecked”), @SuppressWarnings(“serial”) 注释。
  9. 如果方法返回值类型是集合(List,Map,Set….)或数组,且记录为空的时候,返回空的集合或数组,不要返回Null。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1638607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【note3】linux驱动基础,

文章目录 1.互斥锁和自旋锁选择&#xff1a;自旋锁&#xff08;开销少&#xff09;的自旋时间和被锁住的代码执行时间成正比关系2.linux错误码&#xff1a;64位错误指针指向内核空间最后一页&#xff0c;对于 1.互斥锁和自旋锁选择&#xff1a;自旋锁&#xff08;开销少&#x…

QT:核心控件-QWidget

文章目录 控件enableobjectNamegeometrysetWindowTitleopacitycursorFonttooltipstyleSheet 控件 什么是控件&#xff1f; 如上所示&#xff0c;就是控件&#xff0c;而本篇要做的就是对于这些控件挑选一些比较有用的常用的进行讲解分析 在QT的右侧&#xff0c;会有对应的空间…

【面试经典 150 | 分治】将有序数组转换为二叉搜索树

文章目录 写在前面Tag题目来源解题思路方法一&#xff1a;中序遍历递归建树 写在最后 写在前面 本专栏专注于分析与讲解【面试经典150】算法&#xff0c;两到三天更新一篇文章&#xff0c;欢迎催更…… 专栏内容以分析题目为主&#xff0c;并附带一些对于本题涉及到的数据结构等…

如何有效地合并和分类多个文件目录?

在现代办公环境中&#xff0c;文件管理和组织是至关重要的。随着科技的发展&#xff0c;我们不再仅仅依赖于纸质文件&#xff0c;而是更多地使用电子设备来存储和管理信息。这种转变带来了一些新的挑战&#xff0c;其中之一就是如何有效地合并和分类多个目录文件。一&#xff0…

Sortable 拖拽行实现el-table表格顺序号完整例子,vue 实现表格拖拽行顺序号完整例子

npm install sortable<template><vxe-modalref"modalRef"v-model"showModal"title"详情"width"70vw"height"60vh"class"his"transfer><el-table ref"tableRef" :data"tableData&q…

树莓派5用docker运行Ollama3

书接上回&#xff0c;树莓派5使用1panel安装 Ollama 点击终端就可以进入容器 输入以下代码 ollama run llama3Llama3 是市场推崇的版本。您的 树莓派5上必须至少有 4.7GB 的可用空间&#xff0c;因此用树莓派玩机器学习就必须配置大容量的固态硬盘。用1panel部署网络下载速度…

4G远程温湿度传感器在农业中的应用—福建蜂窝物联网科技有限公司

解决方案 农业四情监测预警解决方案 农业四情指的是田间的虫情、作物的苗情、气候的灾情和土壤墒情。“四情”监测预警系统的组成包括管式土壤墒情监测站、虫情测报灯、气象站、农情监测摄像机&#xff0c;可实时监测基地状况,可以提高监测的效率和准确性&#xff0c;为农业生…

“Unite“ > MacOS下很不错的网站转应用App的工具

前言 前不久在浏览mac论坛&#xff0c;无意了解到一款非常好的工具&#xff0c;可以将网站转换为app&#xff0c;考虑到我们现在的主要应用都从本地客户端转成web形式使用&#xff0c;但基于本能的使用习惯&#xff0c;还是希望有个快捷的访问信息&#xff0c;这个应用非常适合…

202012青少年软件编程(Python)等级考试试卷(一级)

第 1 题 【单选题】 运行下方代码段&#xff0c;输出是6&#xff0c;则输入的可能是&#xff08; &#xff09;。 a eval(input())print(a)A :8%2 B :8/2 C :3*2 D :3**2 正确答案:C 试题解析: 第 2 题 【单选题】 关于Python变量&#xff0c;下列叙述正确的是&#x…

Offer必备算法33_DFS爆搜深搜回溯剪枝_八道力扣题详解(由易到难)

目录 ①力扣784. 字母大小写全排列 解析代码1_path是全局变量 解析代码2_path是函数参数 ②力扣526. 优美的排列 解析代码 ③力扣51. N 皇后 解析代码 ④力扣36. 有效的数独 解析代码 ⑤力扣37. 解数独 解析代码 ⑥力扣79. 单词搜索 解析代码 ⑦力扣1219. 黄金矿…

[嵌入式系统-58]:RT-Thread-内核:线程间通信,邮箱mailbox、消息队列MsgQueue、信号Signal

目录 线程间通信 1. 邮箱 1.1 邮箱的工作机制 1.2 邮箱控制块 1.3 邮箱的管理方式 &#xff08;1&#xff09;创建和删除邮箱 &#xff08;2&#xff09;初始化和脱离邮箱 &#xff08;3&#xff09;发送邮件 &#xff08;4&#xff09;等待方式发送邮件 &#xff08…

excel 和 text 文件的读写操作

excel 和 text 文件的读写操作 1. text 文件读写包 open语句 在文件存在的时候&#xff0c;即打开文件&#xff08;此时操作会覆盖文件&#xff0c;实际就是删除文件重后重新创建&#xff09;&#xff1b;在文件不存在的时候&#xff0c;即创建文件。 import sys print(sys.…

商务谈判技巧与口才书籍有哪些类型

商务谈判技巧与口才书籍有哪些类型&#xff08;3篇&#xff09; 商务谈判技巧与口才书籍的类型丰富多样&#xff0c;以下从三个角度进行介绍&#xff1a; **篇&#xff1a;基础理论与策略类书籍 这类书籍通常深入剖析谈判的本质&#xff0c;系统介绍谈判的原理、技巧和策略。…

S-Clustr+Nets3e 僵尸网络偷拍照片插件

项目地址:https://github.com/MartinxMax/S-Clustr-Ring 更新内容 本次将Nets3e(https://github.com/MartinxMax/Nets3e/tree/Nets3e_V1.1.4)插件成功嵌入,意味着你可以指定任意节点下的主机进行拍照 一些嵌入式设备与工业PLC设备与个人PC计算机回连控制 核心服务端搭建 最好…

MySQL-----多表查询(二)

目录 一.子查询概述&#xff1a; 二&#xff1a;标量子查询&#xff1a; 三&#xff1a;列子查询&#xff1a; 四&#xff1a;行子查询&#xff1a; 五&#xff1a;表子查询&#xff1a; 六&#xff1a;练习部分&#xff1a; 写在之前&#xff1a;本文承接上文MySQL-----多…

邦注科技 温控箱对企业的重要性

注塑加工是将加热的熔融塑料注入模具中形成所需产品的工艺过程。良好的注塑加工工艺需要控制好许多参数&#xff0c;其中最重要的因素之一就是模具的温度。模具温度的不稳定会导致产品尺寸大小、表面缺陷等方面的问题&#xff0c;甚至会导致生产不良品&#xff0c;加大生产成本…

普冉PY32系列(十五) PY32F0系列的低功耗模式

目录 普冉PY32系列(一) PY32F0系列32位Cortex M0 MCU简介普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境普冉PY32系列(三) PY32F002A资源实测 - 这个型号不简单普冉PY32系列(四) PY32F002A/003/030的时钟设置普冉PY32系列(五) 使用JLink RTT代替串口输出日志普冉PY32…

【深入浅出MySQL】「性能调优」高性能查询优化MySQL的SQL语句编写

高性能查询优化MySQL的SQL语句编写准则这里写目录标题 总体优化大纲&#xff08;1&#xff09;优化查询性能&#xff1a;通过索引降低全表扫描频率优化方向案例介绍问题分析解决方案建立复合索引建立单独索引 &#xff08;2&#xff09;优化数据表与查询&#xff1a;合理使用非…

数组的扩容与缩容

数组的扩容与缩容 文章目录 数组的扩容与缩容数组的扩容内存分析 数组的缩容内存分析内存分析 数组的扩容 数组扩容是指当原有数组的空间不足以容纳更多的元素时&#xff0c;创建一个新的、长度更大的数组&#xff0c;并将原数组中的元素复制到新数组中&#xff0c;然后更新原…

OpenFeign夺命9连问

今天介绍一款服务调用的组件&#xff1a;OpenFeign&#xff0c;同样是一款超越先辈&#xff08;Ribbon、Feign&#xff09;的狠角色。 文章目录如下&#xff1a; 这篇文章之前陈某发过&#xff0c;全网阅读 10W &#xff0c;时隔一年发出来让大家复习复习&#xff0c;部分读者…