当前位置: 首页 > news >正文

阿里巴巴Java开发手册学习记录

阿里巴巴Java开发手册学习记录

一、编程规约

1.命名风格

  • 严禁使用英文 + 拼音混合使用

  • 类名应所有单词的首字母大写,除了(UserDO,XxxDTO, XxxPo等)

  • 常量的命名应该是大写 + 单词间用下划线连接

  • 抽象类的应以Abstract/Base开头

  • POJO类中的布尔变量,都不要以is前缀,否则某些框架解析会引起序列化错误, 。 (之前看一个文章就是因为XxxDTO方法的命名为isXxxXxx(),导致方法被错误的序列化,造成了线上事故,文章:https://mp.weixin.qq.com/s/994BAkKPEeBz_gs_6LN2DQ)

  • 如果模块、接口、类、方法使用了设计模式,应体现在命名中

  • 领域模型命名规约

    • 数据对象:xxxDO, xxx为数据表名
  • 数据传输对象:xxxDTO, xxx为业务领域相关

  • 展示对象,xxxVO,xxx为网页名称

  • POJO是DO/DTO/BO/VO的统称,禁止使用xxxPOJO

  • 如果变量值仅在一个固定范围内变化用enum声明

2.代码格式

  • 单行字符限制不超过120各,超出要换行:
    • 第二行相对于第一行缩进4个空格
    • 运算符与下文一起换行(例如:“.”)
    • 方法调用中多个参数,在逗号后换行
  • 可以插入一个空行将不同的逻辑、语义、谈业务分隔开,提高可读性。

3.OOP规约

  • 所有重写父类的方法都需要加@Override,可以判断是否重写成功
  • 接口过时必须加@Deprecated,并说明新接口的位置。
  • 不使用过时的类和方法
  • 在使用equals时,应使用常量或者确定有值的对象的equals的方法
  • 所有的POJO类属性必须使用包装类型,RPC方法的返回值和参数必须使用包装类型
  • 如果完全不兼容升级,避免反序列化混乱,要修改serialVersionUID
  • 构造方法中不加任何业务逻辑
  • 禁止在POJO类中同时存在一个属性的isXxx()和getXxx()方法
    • 因为在序列化时,不确定优先调用哪个方法,对于is开头的枚举型变量,会在序列化调用isXxx的时候会把属性的is吃掉,导致序列化出错。(案例:https://zhuanlan.zhihu.com/p/265869701)
    • 解决方案:1.遵循开发规范,不要用is开头的变量。2.使用JSONField(name = “anotherName”)来定制属性名。3.可以手动修改getter和setter。
  • 类内方法定义顺序:公有方法>私有>getter/setter方法
  • 对象的clone方法默认时浅拷贝,若想要实现深拷贝,需要重写clone方法。
  • 工具类不允许有public和default构造方法

4.集合处理

  • 只要重写equals,就必须重写hashcode
  • 使用set存储自定义对象时,自定义对象需要重写equals、hashcode 方法
  • 在使用sublist方法时,对原集合的增加或删除,均会导致子列表遍历、增加、删除产生并发修改异常。
  • 在进行list的toArray(size)方法转数组时,应该传入list.size()作为参数这样返回的就是当前类型的数组,如果直接使用无参toArray方法时,返回值是Object类型的数组。
  • Arrays.asList()把数组转换成集合时,不可以使用add等修改方法,否则抛异常。
  • PECS(Producer Extends Consumer Super)原则:频繁往外读取内容的,适合用<? extends T>。经常往里插入的,适合用<? super T>。
  • 不用在foreach里进行元素的remove/add操作,remove可以使用iterator方式,如果并发操作需要对Iterator对象加锁。(这里虽说foreach本质也是迭代器实现,但是反编译以后会发现最后删除时是通过list直接remove,而迭代器删除的是通过迭代器的remove方法删除的

5.并发处理

  • 获取单例对象时,需要保证线程安全
  • 应该使用ThreadPoolExecutor创建线程池
  • SimpleDateFormat线程不安全,如果定义为static,必须加锁,也可以使用DateUtils
  • 如果是 JDK8 的应用,可以使用 Instant 代替 Date,LocalDateTime 代替 Calendar, DateTimeFormatter 代替 SimpleDateFormat
  • 对多个资源(表、对象)同时加锁时,应该保持加锁顺序的一致性,避免死锁。
  • 并发修改同一记录时,避免更新丢失,可以在应用层、缓存加锁,或者数据库层使用乐观锁。(如果每次访问冲突概率小于20%,推荐使用乐观锁,否则使用悲观锁。乐观锁的重试次数不得小于3 次。)
  • 避免多个线程使用一个Random(Random或Math.random),会导致性能下降,可以使用ThreadLocalRandom
  • 在多线程场景下计数,volatile无法应对多写的场景,一般我们会选择AtomicInteger,但是在竞争比较激烈的场景下,可以使用LongAdder性能更好(空间换时间,内部将数组分段计数最后求和,但是只使用计数场景下)。
  • ThreadLocal 建议使用static修饰,只需要创建一次,一个线程内的所有对象都已操作这个变量。

6.控制语句

  • 高并发场景中,避免使用等于作为中断或者退出的条件,如果并发条件没有处理好,会出现等值“击穿”的情况,所以应该使用大于或者小于
  • 避免在if条件判断中使用复杂的方法,(getXxx/isXxx除外)
  • 循环体内要考虑性能,所以一些不必要的操作应该放到循环体外进行

7.注释规约

  • 注释的主要作用:能精确反应设计思想和代码逻辑、描述业务含义。
  • 代码逻辑修改的同时,注释也要进行相应的修改,尤其是参数、返回值、异常、核心逻辑
  • 所有的枚举类型的字段必须要有注释

8.异常处理

  • catch异常时,对于非稳定代码来说catch尽量区分异常类型,再做对应的异常处理,不要对一大段代码做try-catch处理
  • 捕获了异常就应该处理它
  • 应该严格避免NPE

9.日志规约

  • 应用中不可直接使用日志系统(Log4j、Logback)中的Api,而应该依赖日志框架SLF4J中的Api。
  • 应用中的扩展日志命名方式:appName_logType_logName.log
  • 对trace/debug/info级别的日志输出,应该使用条件输出或者使用占位符(slf4j支持占位符),对于warn等不满足的日志级别,即使不输出,但也会准备参数,浪费系统资源。
  • 生产环境禁止输出debug级别日志,有选择地输出info日志,写日志输出语句时思考:有人看吗?看到这条日志能做什么?能不能给排查问题带来好处?
  • 可以使用warn日志级别来记录用户输出参数错误。

持续更新…

相关文章:

阿里巴巴Java开发手册学习记录

阿里巴巴Java开发手册学习记录 一、编程规约 1.命名风格 严禁使用英文 拼音混合使用 类名应所有单词的首字母大写&#xff0c;除了&#xff08;UserDO&#xff0c;XxxDTO, XxxPo等&#xff09; 常量的命名应该是大写 单词间用下划线连接 抽象类的应以Abstract/Base开头 …...

论文阅读---《Unsupervised T ransformer-Based Anomaly Detection in ECG Signals》

题目&#xff1a;基于Transformer的无监督心电图&#xff08;ECG&#xff09;信号异常检测 摘要 异常检测是数据处理中的一个基本问题&#xff0c;它涉及到医疗感知数据中的不同问题。技术的进步使得收集大规模和高度变异的时间序列数据变得更加容易&#xff0c;然而&#xff…...

收藏这8个好用的原型设计工具,轻松制作原型图

在设计工作中&#xff0c;原型设计是非常关键的一步&#xff0c;而原型设计工具又能帮助设计师更轻松地完成设计工作。今天本文将与大家分享8个好用的原型设计工具&#xff0c;一起来看看吧&#xff01; 1、即时设计 即时设计是一个能在线协作的原型工具&#xff0c;也就是说…...

王道计网 第四章笔记

4.1 生活在网络层的“工人”是路由器,他负责各种异构网络的连接,但是因为他只生活在前三层所以从网络层之上的东西他不能管理,所以网路层之上的数据对于路由器来说必须是相同的、透明的。 常见的网络层协议有IP 和 ICMPTCP IP传输层协议FTP应用层协议一句话区分IP和MAC地址…...

C# Blazor 学习笔记(9):动态css/class绑定

文章目录 前言相关资料css和class绑定直接绑定间接绑定 前言 之前我们说到&#xff0c;我们组件化有三个目的。 不用写CSS不用写html不用写交互逻辑 为了解决第一个目的&#xff0c;我们需要动态css 相关资料 Blazor入手教程&#xff08;二&#xff09;css和class绑定 cs…...

vue3学习-Pinia状态管理

Pinia 定义一个Store import { defineStore } from pinia export const useStore defineStore(main, {})这个 name&#xff0c;也称为 id&#xff0c;是必要的&#xff0c;Pinia 使用它来将 store 连接到 devtools。 将返回的函数命名为 use… 是跨可组合项的约定&#xff0…...

TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术、提供便捷快速的知识蒸馏框架、提升模型的推理速度,减少内存占用

TextBrewer:融合并改进了NLP和CV中的多种知识蒸馏技术、提供便捷快速的知识蒸馏框架、提升模型的推理速度&#xff0c;减少内存占用 TextBrewer是一个基于PyTorch的、为实现NLP中的知识蒸馏任务而设计的工具包&#xff0c; 融合并改进了NLP和CV中的多种知识蒸馏技术&#xff0…...

乍得ECTN(BESC)申请流程

根据TCHAD/CHAD乍得法令&#xff0c;自2013年4月1日起&#xff0c;所有运至乍得的货物都必须申请ECTN(BESC)电子货物跟踪单。如果没有申请&#xff0c;将被视为触犯乍得的条例&#xff0c;并在目的地受到严厉惩罚。ECTN是英语ELECTRONIC CARGO TRACKING NOTE的简称&#xff1b;…...

【100天精通python】Day28:文件与IO操作_JSON文件处理

目录 专栏导读 1. JSON数据格式简介 1.1 示例JSON数据 1.2 JSON文件的特点 2 json模块的常用操作 2.1 读写JSON文件的示例 2.2 解析JSON字符串 2.3 修改JSON数据 2.4 查询和操作嵌套数据 2.5 处理包含特殊字符的JSON文件 2.6 处理日期和时间 2.7 处理大型JSON文…...

配置两台数据库为主从数据库模式

一、主库配置 1、修改配置文件 /etc/my3306.cnf #mysql服务ID&#xff0c;保证整个集群环境中唯一&#xff0c;默认为1server-id1#是否只读&#xff0c;1代表只读&#xff0c;0代表读写read-only0#忽略的数据&#xff0c;指不需要同步的数据库#binlog-ignore-dbmysql#指定同步…...

linux允许root远程ssh登录

修改文件/etc/ssh/sshd_config # cat /etc/ssh/sshd_config ... #LoginGraceTime 2m #PermitRootLogin prohibit-password #StrictModes yes #MaxAuthTries 6 #MaxSessions 10 ...将 #PermitRootLogin prohibit-password标注为&#xff1a; PermitRootLogin yes样例&#xf…...

Baumer工业相机堡盟工业相机如何通过BGAPISDK获取相机接口数据吞吐量(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK里函数来获取相机当前数据吞吐量&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的数据吞吐量的技术背景CameraExplorer如何查看相机吞吐量信息在BGAPI SDK里通过函数获取相机接口吞吐量 Baumer工业相机通过BGAPI SDK获取数…...

Spring @Scheduled单线程单实例的坑

文章目录 前言背景验证解决方案 前言 在 Java Spring 项目中经常会用 Scheduled 来实现一些定时任务的场景&#xff0c;有必要了解一些它使用时的问题和内部实现机制。本文是偶然间发现的一个问题&#xff0c;刷新了我的认知&#xff0c;分享给大家。 其他相关文章&#xff1…...

7-数据结构-(带头节点)单链表的增删改查

问题&#xff1a; 单链表带头结点的创建以及输出&#xff0c;以及带与不带头节点的区别 思路&#xff1a; 单链表&#xff0c;逻辑上是线性结构&#xff0c;由许多单链表结点&#xff0c;串成一串。其单链表结构体中&#xff0c;数据项由data数据域和结点指针域。带头节点是为…...

每天一道leetcode:剑指 Offer 53 - II. 0~n-1中缺失的数字(适合初学者二分查找)

今日份题目&#xff1a; 一个长度为n-1的递增排序数组中的所有数字都是唯一的&#xff0c;并且每个数字都在范围0&#xff5e;n-1之内。在范围0&#xff5e;n-1内的n个数字中有且只有一个数字不在该数组中&#xff0c;请找出这个数字。 示例1 输入: [0,1,3] 输出: 2 示例2 …...

玩机搞机---安卓新机型payload.bin刷写救砖 无需专用线刷包

目前的新机型官方卡刷包解包后都是payload.bin分区格式的卡刷固件。而有个别一些机型没有线刷包&#xff0c;当这些机型出现系统问题的时候有以下几种方法参考救砖。遇到类似故障的朋友可以借鉴参考下. 其中的不足和相关的资源可以参考这两个博文。任何教程的目的只是拓展你的…...

配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】——“cpolar内网穿透”

配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】 文章目录 配置固定二级子域名远程访问内网群晖NAS 7.X版 【内网穿透】前言1. 创建一条固定数据隧道2. 找到“保留二级子域名”栏位3. 重新编辑之前建立的临时数据隧道4. 进入“在线隧道列表”页面5. 在其他浏览器访问…...

【枚举】CF1706 C

有人一道1400写了一个小时 Problem - C - Codeforces 题意&#xff1a; 思路&#xff1a; 首先先去观察样例&#xff1a; 很显然&#xff0c;对于n是奇数的情况&#xff0c;只有一种情况&#xff0c;直接操作偶数位就好了 主要是没搞清楚n是偶数的情况 其实有个小技巧&…...

uniapp-疫情应急管理系统学生端

1 疫情资讯展示 <template><view class"container"><uni-section title"自定义卡片内容" type"line"><uni-card title"基础卡片" class"card-box" v-for"(item,index) in epidemicNewsList"…...

FreeRTOS的线程间通信

一、分类 FreeRTOS的线程间通信分为这几大类 由于我还在学习中&#xff0c;目前显从信号开始记录学习 二、逐块讲解 1、信号&#xff08;osSignalWait osSignalSet&#xff09; FreeRTOS从V8.2.0版本开始提供任务通知这个功能&#xff0c;每个任务多有一个32位的通知值&am…...

业务系统对接大模型的基础方案:架构设计与关键步骤

业务系统对接大模型&#xff1a;架构设计与关键步骤 在当今数字化转型的浪潮中&#xff0c;大语言模型&#xff08;LLM&#xff09;已成为企业提升业务效率和创新能力的关键技术之一。将大模型集成到业务系统中&#xff0c;不仅可以优化用户体验&#xff0c;还能为业务决策提供…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...