JAVA Coding 规范

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。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows rabbitMq安装

一、Erlang 环境准备 下载安装包 跟我们跑java项目&#xff0c;要装jdk类似。rabbitMQ是基于Erlang开发的&#xff0c;因此安装rabbitMQ服务器之前&#xff0c;需要先安装Erlang环境。 官网直接下载windows直装版本&#xff1a;https://www.erlang.org/downloads 无脑安装&a…

【CGALDotNet】CGAL的C#封装(C#调用编译好的CGAL的dll)

介绍 开源项目出处&#xff08;两个模块&#xff09;&#xff1a; 链接1&#xff1a;https://github.com/Scrawk/CGALDotNet/tree/master?tabreadme-ov-file 链接2&#xff1a;https://github.com/Scrawk/CGALDotNetGeometry 该项目提供了编译的、封装相关接口后的CGAL库&am…

C语言 | Leetcode C语言题解之第62题不同路径

题目&#xff1a; 题解&#xff1a; int uniquePaths(int m, int n) {long long ans 1;for (int x n, y 1; y < m; x, y) {ans ans * x / y;}return ans; }

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

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

万兆以太网MAC设计(11)完整UDP协议栈仿真

文章目录 前言一、模块接口二、IP模块与ARP模块之间的联系三、整体协议栈仿真总结&#xff1a; 前言 目前除了巨帧处理逻辑之外&#xff0c;所有的准备工作都已经结束了&#xff0c;先进行整体的功能验证。 一、模块接口 所有模块接口皆采用AXIS数据流的形式&#xff0c;其中…

IDEA基于Maven构建项目

IDEA基于Maven构建项目 一、Maven简介 Apache Maven 是一个软件项目管理和理解工具。基于项目对象模型的概念&#xff08;POM&#xff09;&#xff0c;Maven 可以从中心信息中管理项目的构建、报告和文档。 Apache Maven 可以用于构建和管理任何基于 Java 的项目。 下载地址…

【Web】D^3CTF之浅聊d3pythonhttp——TE-CL请求走私

目录 step0 题目信息 step1 jwt空密钥伪造 step1.5 有关TE&CL的lab step2 TE-CL请求走私 payload1 payload2 step0 题目信息 注意到题目源码前端是flask写的&#xff0c;后端是web.py写的 frontend from flask import Flask, request, redirect, render_templat…

C#核心之面向对象-封装

面向对象-封装 文章目录 1、类和对象1、什么是类2、类的声明3、类声明语法4、类声明实例5、对象(类)6、实例化对象语法7、实例化对象 2、成员变量和访问修饰符1、成员变量2、访问修饰符3、成员变量的使用和初始值 3、成员方法1、成员方法声明2、成员方法的使用 4、构造函数和…

【工具类安装教程】IDEA Ui设计器JFormDesigner

1、下载插件 File->Settings->Plugins->JFormDesigner 2、注册教程 2.1注册机下载 链接&#xff1a;https://pan.baidu.com/s/1Rb1EMva5HIYbyBcYgCxIsw 提取码&#xff1a;6666 2.2找到目录 1、找到idea目录 2.3进入plugins目录 找到在JFormDesigner文件夹下lib文…

使用Gitbook生成电子书

背景 《Google工程实践文档》相对原文Google’s Engineering Practices documentation &#xff0c;部分内容过时了。需要更新中文版&#xff0c;并使用Gitbook把Markdown文件转换成对应的PDF电子书。   上一次生成PDF电子书是5年前&#xff0c;当时生成电子书的环境早已不在…

jenkins汉化不完全问题解决

jenkins安装完Localization:Chinese(Simplified)中文语言包后&#xff0c;发现是出现汉化不完全或者部分汉化的情况&#xff0c;如下图&#xff1a; 解决方法&#xff1a; 启动命令中指定语言 -Duser.languageen_US.UTF-8 或者 -Duser.languageC.UTF-8原因分析&#xff1a;安…

用户中心(下)

文章目录 计划登录逻辑接口简单说明cookie和session写代码流程后端逻辑层控制层测试用户管理接口 前端简化代码对接后端代理 计划 开发完成后端登录功能 &#xff08;单机登录 > 后续改造为分布式 / 第三方登录&#xff09;✔开发后端用户的管理接口 &#xff08;用户的查询…

南方Southmap4.0 一体成图软件

SouthMap 4.0 新增行业应用模块&#xff0c;实用工具箱扩展7大工具&#xff0c;集结8大模块&#xff0c;共45种实用功能&#xff0c;为水利、电力、道路施工等多应用场景提供数据生产的一站式解决方案。 SouthMap 4.0 新增行业应用模块&#xff0c;实用工具箱扩展7大工具&#…

前端素材库

大家好我是苏麟 , 今天推荐一个前端素材库 . 官网 : iconfont-阿里巴巴矢量图标库 这期就到这里 , 下期见!

【docker】docker compose 搭建私服

安装 Docker Registry 创建目录 mkdir -pv /usr/local/docker/registrymkdir -pv /usr/local/docker/data 创建 docker-compose.yml文件 进入目录创建docker-compose.yml cd /usr/local/docker/registrytouch docker-compose.yml 编辑docker-compose.yml vim docker-compo…

探索洗牌算法的魅力与杨辉三角的奥秘:顺序表的实际运用

目录 目录 前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; 洗牌算法 准备工作 买一副牌 洗牌 发牌 测试整体 &#x1f3af;&#x1f3af;很重要的一点 杨辉三角 总结 前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; Hello, Hello~ …

YOLOv9/YOLOv8算法改进【NO.128】 使用ICCV2023超轻量级且高效的动态上采样器( DySample)改进yolov8中的上采样

前 言 YOLO算法改进系列出到这&#xff0c;很多朋友问改进如何选择是最佳的&#xff0c;下面我就根据个人多年的写作发文章以及指导发文章的经验来看&#xff0c;按照优先顺序进行排序讲解YOLO算法改进方法的顺序选择。具体有需求的同学可以私信我沟通&#xff1a; 首推…

PaLmTac嵌入软体手手掌的视触觉传感器

触觉是感知和操作之间的桥梁。触觉信息对于手部行为反馈和规划具有重要意义。软体手的柔性特性在人机交互、生物医学设备和假肢等方面具有潜在应用的优势。本文提出了一种名为 PaLmTac的嵌入软体手手掌的视触觉传感器&#xff08;vision-based tactile sensor, VBTS&#xff09…

使用 BurpSuite 基于 Token 机制实施暴力破解

前言 Token是一种用于身份验证和授权的令牌&#xff0c;通常由服务器生成并发送给客户端&#xff0c;客户端在后续的请求中携带该令牌来进行身份验证和授权操作。Token的使用可以增强应用程序的安全性&#xff0c;避免了直接传递敏感凭证&#xff08;如用户名和密码&#xff0…

Gradle 进阶学习之 Gradle插件

1、使用插件的原因 使用插件是现代自动化构建工具中一个非常重要的概念&#xff0c;Gradle 作为其中一个流行工具&#xff0c;通过插件提供了多种便利。以下是使用插件的几个主要原因&#xff1a; 促进代码重用 减少重复代码&#xff1a;插件允许你重用在不同项目中执行相同功…