【Android】Java开发语言规范

Java语言规范

命名风格

  1. **类名:**使用 UpperCamelCase 风格,必须遵从驼峰形式,但以下情形例外:DO / BO /
    DTO / VO / AO,所有单词的首字母大写
  2. **方法名、参数名、成员变量、局部变量:**统一使用 lowerCamelCase 风格,也都必须遵从驼峰形式,除第一个单词之外所有单词的首字母大写
  3. **常量:**全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长
  4. **包名:**统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词。包名统一使用单数形式,类名可以使用复数形式
  5. **POJO 类(Java对象类)中布尔类型的变量:**都不要加 is,否则部分框架解析会引起序列化错误,例如定义为基本数据类型 Boolean isDeleted;的属性,它的方法也是 isDeleted(),RPC框架在反向解析的时候,“以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常
  6. **接口:**类中的方法和属性不要加任何修饰符号(public 也不要加),保持代码的简洁性,并加上有效的 Javadoc 注释。尽量不要在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,并且是整个应用的基础常量

Tips:

  1. 代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束
  2. 代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式,正确的英文方便让读者理解,即使是纯拼音也要避免采用
  3. 抽象类命名使用 Abstract 或 Base 开头;异常类命名使用 Exception 结尾;测试类命名以它要测试的类的名称开始,以 Test 结尾
  4. 如果模块、接口、类、方法使用了设计模式,在命名时体现出具体模式
  5. 杜绝完全不规范的缩写,避免望文不知义,使用尽量完整的单词组合来表达其意

常量定义

  1. 不允许任何魔法值(即未经定义的常量)直接出现在代码中
  2. 不要使用一个常量类维护所有常量,按常量功能进行归类,分开维护
  3. 如果变量值仅在一个范围内变化,且带有名称之外的延伸属性,定义为枚举类。下面正例中的数字就是延伸信息,表示星期几
  4. 常量的复用层次有五层:跨应用共享常量、应用内共享常量、子工程内共享常量、包内共享常量、类内共享常量。
    • 跨应用共享常量:放置在二方库中,通常是 client.jar 中的 constant 目录下
    • 应用内共享常量:放置在一方库中,通常是 modules 中的 constant 目录下
    • 子工程内部共享常量:即在当前子工程的 constant 目录下
    • 包内共享常量:即在当前包下单独的 constant 目录下
    • 类内共享常量:直接在类内部 private static final 定义

代码格式

  1. **大括号:**左大括号前不换行,左大括号后换行,右大括号前换行,右大括号后还有 else 等代码则不换行;表示终止的右大括号后必须换行
  2. **空格:**左(右)小括号和字符之间不出现空格;if/for/while/switch/do 等保留字与括号之间都必须加空格;任何二目、三目运算符的左右两边都需要加一个空格;注释的双斜线与注释内容之间有且仅有一个空格;方法参数在定义和传入时,多个参数逗号后边必须加空格
  3. 注释:

①类、方法、成员变量的注释

/*** 类、方法、成员变量*/

对于类注释,应该完善作者、时间、类的作用等信息

②代码中的注释,使用双斜线

OOP规约

  1. 避免通过一个类的对象引用访问此类的静态变量或静态方法,无谓增加编译器解析成本,直接用类名来访问即可
  2. 相同参数类型,相同业务含义,才可以使用 Java 的可变参数,避免使用 Object
  3. 外部正在调用或者二方库依赖的接口,不允许修改方法签名,避免对接口调用方产生影响。接口过时必须加@Deprecated 注解,并清晰地说明采用的新接口或者新服务是什么
  4. Object 的 equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用
    equals
  5. 构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中

集合处理

  1. 关于 hashCodeequals 的处理,遵循如下规则:
    • 只要重写 equals,就必须重写 hashCode
    • 因为 Set 存储的是不重复的对象,依据 hashCodeequals 进行判断,所以 Set 存储的对象必须重写这两个方法
    • 如果自定义对象做为 Map 的键,那么必须重写 hashCodeequals
  2. 不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator方式,如果并发操作,需要对 Iterator 对象加锁

Iterator 是一种设计用来遍历集合(如 ListSet)元素的接口。使用 Iterator 来移除元素是一种安全的做法,因为它内部维护了一个指向下一个要返回元素的游标。当使用 Iteratorremove() 方法来移除元素时,它能够确保集合的状态保持一致,即使在并发环境下也是如此

  1. 高度注意 Map 类集合 K/V 能不能存储 null 值的情况

在这里插入图片描述

并发处理

  1. 获取单例对象需要保证线程安全,其中的方法也要保证线程安全
  2. 创建线程或线程池时请指定有意义的线程名称,方便出错时回溯
  3. 线程资源必须通过线程池提供,不允许在应用中自行显式创建线程

使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题

  1. SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为static,必须加锁,或者使用 DateUtils 工具类

控制语句

  1. 在 if/else/for/while/do 语句中必须使用大括号。即使只有一行代码,避免采用
    单行的编码方式
  2. 在一个 switch 块内,每个 case 要么通过 break/return 等来终止,要么注释说明程序将继续执行到哪一个 case 为止;在一个 switch 块内,都必须包含一个 default 语句并且放在最后,即使它什么代码也没有

注释规约

  1. 类、类属性、类方法的注释必须使用 Javadoc 规范,使用/*内容/格式,不得使用// xxx 方式
  2. 所有的抽象方法(包括接口中的方法)必须要用 Javadoc 注释、除了返回值、参数、异常说明外,还必须指出该方法做什么事情,实现什么功能
  3. 所有的类都必须添加创建者和创建日期
  4. 方法内部单行注释,在被注释语句上方另起一行,使用//注释。方法内部多行注释使用/* */注释,注意与代码对齐
  5. 所有的枚举类型字段必须要有注释,说明每个数据项的用途
  6. 代码修改的同时,注释也要进行相应的修改,尤其是参数、返回值、异常、核心逻辑等的修改,没有用处的的代码应删除而不是注释掉,一般注释适用于后续可能会恢复此代码的逻辑或者因为是别人写的没有备注信息,不知道代码的动机
  7. 特殊注释标记,请注明标记人与标记时间。注意及时处理这些标记,通过标记扫描,经常清理此类标记。线上故障有时候就是来源于这些标记处的代码
    • 待办事宜(TODO):( 标记人,标记时间,[预计处理时间]):表示需要实现,但目前还未实现的功能。这实际上是一个 Javadoc 的标签,目前的 Javadoc还没有实现,但已经被广泛使用。只能应用于类,接口和方法(因为它是一个 Javadoc 标签)。
    • 错误,不能工作(FIXME):(标记人,标记时间,[预计处理时间]):在注释中用 FIXME 标记某代码是错误的,而且不能工作,需要及时纠正的情况

其它规范

  1. 获取当前毫秒数 System.currentTimeMillis(); 而不是 new Date().getTime()

  2. 任何数据结构的构造或初始化,都应指定大小,避免数据结构无限增长吃光内存

  3. 注意 Math.random() 这个方法返回是 double 类型,注意取值的范围 0≤x<1(能够取到零值,注意除零异常),如果想获取整数类型的随机数,不要将 x 放大 10 的若干倍然后取整,直接使用 Random 对象的 nextInt 或者 nextLong 方法

异常处理

  1. Java 类库中定义的一类 RuntimeException 可以通过预先检查进行规避,而不应该通过 catch 来处理,比如:IndexOutOfBoundsExceptionNullPointerException 等等

IndexOutOfBoundsException 是一个由数组或集合的索引操作引发的异常。当尝试访问数组或列表等数据结构的索引位置超出其有效范围时,就会抛出这个异常。

NullPointerException 是在尝试使用一个未被初始化(即null)的对象时抛出的异常。这意味着你尝试调用一个null引用的方法或访问其属性。

  1. 对大段代码进行 try-catch,这是不负责任的表现。catch 时请分清稳定代码和非稳定代码,稳定代码指的是无论如何不会出错的代码。对于非稳定代码的 catch 尽可能进行区分异常类型,再做对应的异常处理
  2. 异常不要用来做流程控制,条件控制,因为异常的处理效率比条件分支低
  3. 捕获异常是为了处理它,不要捕获了却什么都不处理而抛弃之,如果不想处理它,请将该异常抛给它的调用者。最外层的业务使用者,必须处理异常,将其转化为用户可以理解的内容
  4. 有 try 块放到了事务代码中,catch 异常后,如果需要回滚事务,一定要注意手动回滚事务

MySQL数据库

建表规约

  1. 表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint( 1 表示是,0 表示否)
  2. 表名、字段名必须使用小写字母或数字,禁止出现数字开头,禁止两个下划线中间只出现数字。数据库字段名的修改代价很大,因为无法进行预发布,所以字段名称需要慎重考虑
  3. 表名不使用复数名词
  4. 主键索引名为 pk字段名;唯一索引名为 uk字段名;普通索引名则为 idx_字段名
  5. 小数类型为 decimal,禁止使用 floatdouble
  6. varchar 是可变长字符串,不预先分配存储空间,长度不要超过 5000,如果存储长度大于此值,定义字段类型为 text,独立出来一张表,用主键来对应,避免影响其它字段索引效率

索引规则

  1. 业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引
  2. 超过三个表禁止 join(连接)。需要 join 的字段,数据类型必须绝对一致;多表关联查询时,保证被关联的字段需要有索引
  3. 在 varchar 字段上建立索引时,必须指定索引长度,没必要对全字段建立索引,根据实际文本区分度决定索引长度即可

SQL语句

  1. 不要使用 count(列名)或 count(常量)来替代 count(),count()是 SQL92 定义的标准统计行数的语法,跟数据库无关,跟 NULL 和非 NULL 无关
  2. 禁止使用存储过程,存储过程难以调试和扩展,更没有移植性
  3. 数据订正时,删除和修改记录时,要先 select,避免出现误删除,确认无误才能执行更新语句

参考文档:

《阿里巴巴Java开发手册(终极版)》免费在线阅读_藏经阁-阿里云开发者社区 (aliyun.com)

《阿里巴巴Android开发手册》免费在线阅读_藏经阁-阿里云开发者社区 (aliyun.com)

本篇博客只讲述了开发过程当中的基本语言规范,想要更了解可以看以上参考文档,会有更多的规范内容。

到这里就结束了!

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

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

相关文章

一些硬件知识【2024/11/2】

当需要提供功率型的输出信号的时候&#xff0c;可以在信号发生器外接功率放大器&#xff0c;这样可以提高输出功率 信号的调幅&#xff08;AM&#xff09;、调频&#xff08;FM&#xff09;与调相&#xff08;PM&#xff09;&#xff1a; 调制信号&#xff1a;控制高频振荡的低…

WPF自定义日历控件Calendar 的方法

推荐下载地址 https://www.haolizi.net/example/view_2107.html <UserControl.Resources><local1:DayConverter x:Key"DayConverter"/><!--导入转换器--><Style x:Key"CalendarStyle1"TargetType"{x:Type Calendar}">&…

Qt第三课 ----------输入类的控件属性

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

LabVIEW 离心泵机组故障诊断系统

开发了一套基于LabVIEW图形化编程语言设计的离心泵机组故障诊断系统。系统利用先进的数据采集技术和故障诊断方法&#xff0c;通过远程在线监测与分析&#xff0c;有效提升了离心泵的预测性维护能力&#xff0c;保证了石油化工生产的连续性和安全性。 项目背景及意义 离心泵作…

typescript的简介

简介 tsc npm install -g typescripttsc -v作用 检查类型和语法错误&#xff0c;提前纠错 ts的类型 如何穿件带有ts的vue工程 作用 常见类型 用法 编写一个ts文件 let username:string "John";let age:number 25;let isUpdated:boolean true;let data:any &q…

WPF+MVVM案例实战(二十)- 制作一个雷达辐射效果的按钮

文章目录 1、案例效果2、文件创建与代码实现1、创建文件2、图标资源文件3、源代码获取1、案例效果 2、文件创建与代码实现 1、创建文件 打开 Wpf_Examples 项目,在 Views 文件夹下创建窗体界面 RadarEffactWindow.xaml 。代码功能分两个部分完成,一个是样式,一个是动画。页…

​Java面试经典 150 题.P13. 罗马数字转整数(012)​

本题来自&#xff1a;力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣&#xff08;LeetCode&#xff09;全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解&#xff1a; class Solution {public int romanToInt(String s) {int sum…

一键AI换衣-可图AI试衣

我们的真的实现了穿衣自由了吗&#xff1f;上传一张人物图片和衣服的图片&#xff0c;就能实现一键换衣。 这就是可图AI试衣项目 魔塔地址&#xff1a;https://www.modelscope.cn/studio ... lors-Virtual-Try-On 参考&#xff1a; 一键AI换衣-可图AI试衣 https://www.jinsh…

Java项目实战II基于Spring Boot的个人云盘管理系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 基于Spring Boot的个人云盘管理系统设计…

奇瑞汽车:降阶模型在新能源汽车热管理仿真上的应用

随着新能源汽车的发展&#xff0c;对仿真技术的要求也越来越高。那么奇瑞汽车利用降阶模型在新能源汽车热管理仿真上做了哪些应用呢&#xff1f;本次内容主要从四个方面展开介绍&#xff1a; 1、 奇瑞汽车简介&#xff1b; 2、 热管理降阶模型开发的背景&#xff1b; 3、 高低…

ctf文件上传题小总结与记录

解题思路&#xff1a;先看中间件&#xff0c;文件上传点&#xff08;字典扫描&#xff0c;会员中心&#xff09;&#xff0c;绕过/验证&#xff08;黑名单&#xff0c;白名单&#xff09;&#xff0c;解析漏洞&#xff0c;cms&#xff0c;编辑器&#xff0c;最新cve 文件上传漏…

nginx上传文件超过限制大小、响应超时、反向代理请求超时等问题解决

1、文件大小超过限制 相关配置&#xff1a; client_max_body_size&#xff1a; Syntax:client_max_body_size size;Default:client_max_body_size 1m;Context:http, server, location 2、连接超时: proxy_read_timeout&#xff1a; Syntax:proxy_read_timeout time;Default…

00-开发环境 MPLAB IDE 配置

MPLAB IDE V8.83 File 菜单简介 New (CtrlN)&#xff1a; 创建一个新文件&#xff0c;用于编写新的代码。 Add New File to Project...&#xff1a; 将新文件添加到当前项目中。 Open... (CtrlO)&#xff1a; 打开现有文件。 Close (CtrlE)&#xff1a; 关闭当前打开的文件。 …

基于BP神经网络的手写体数字图像识别

基于BP神经网络的手写体数字图像识别 摘要 在信息化飞速发展的时代&#xff0c;光学字符识别是一个重要的信息录入与信息转化的手段&#xff0c;其中手写体数字的识别有着广泛地应用&#xff0c;如&#xff1a;邮政编码、统计报表、银行票据等等&#xff0c;因其广泛地应用范围…

鸿蒙进阶篇-Swiper组件的使用

“在科技的浪潮中&#xff0c;鸿蒙操作系统宛如一颗璀璨的新星&#xff0c;引领着创新的方向。作为鸿蒙开天组&#xff0c;今天我们将一同踏上鸿蒙基础的探索之旅&#xff0c;为您揭开这一神奇系统的神秘面纱。” 各位小伙伴们我们又见面了,我就是鸿蒙开天组,下面让我们进入今…

Ubuntu删除docker

文章目录 安装依赖1.安装操作系统&#xff1a;2.CPU支持 安装docker1.查看系统版本2.执行卸载 安装依赖 1.安装操作系统&#xff1a; 高于 Ubuntu 20.04(LTS) 版本 2.CPU支持 ARM和X86_64 安装docker 1.查看系统版本 cat /etc/*releas*uname -a2.执行卸载 检查本地dock…

【机器学习】23. 聚类-GMM: Gaussian Mixture Model

1. 定义和假设 定义&#xff1a;probabilistic clustering&#xff08;model-base&#xff09; 假设&#xff1a;数据服从正态分布 2. 算法内容 我们假设数据是由k个高斯&#xff08;正态&#xff09;分布混合生成的。每个分布有2个参数&#xff1a;μ和σ。 一个分布对应一…

Node.js:Express 服务 路由

Node.js&#xff1a;Express 服务 & 路由 创建服务处理请求req对象 静态资源托管托管多个资源挂载路径前缀 路由模块化 Express是Node.js上的一个第三方框架&#xff0c;可以快速开发一个web框架。本质是一个包&#xff0c;可以通过npm直接下载。 创建服务 Express创建一…

TensorRT-LLM的k8s弹性伸缩部署方案

Scaling LLMs with NVIDIA Triton and NVIDIA TensorRT-LLM Using Kubernetes | NVIDIA Technical Blog 一共涉及4个k8s组件&#xff1a; 1. Deployment&#xff1a;跑起来N个pod&#xff1b;指定NVIDIA官方的triton&trt-llm的docker image&#xff0c;指定好model放在哪个…

6.0、静态路由

路由器最主要的功能就是转发数据包。路由器转发数据包时需要查找路由表&#xff08;你可以理解为地图&#xff09;&#xff0c;管理员可以直接手动配置路由表&#xff0c;这就是静态路由。 1.什么是路由&#xff1f; 在网络世界中&#xff0c;路由是指数据包在网络中的传输路…