从《阿里巴巴Java开发手册》看Java中的坑

简介: 本文已收录在本人整编的JAVA技术资源目录中,微信用户请点击头像查看《JAVA通关秘籍》简介为什么会有代码规范?一个很重要的原因是,加强代码的可阅读性,避免歧义。

本文已收录在本人整编的JAVA技术资源目录中,微信用户请点击头像查看《JAVA通关秘籍》

简介

为什么会有代码规范?一个很重要的原因是,加强代码的可阅读性,避免歧义。还有一个重要的原因是,有许多语法允许,但是你这么做了,在特定情况下就会坑你一下你还不知道怎么回事的用法,应该避免使用。

今天,我们就扒一扒《阿里巴巴Java开发手册》中的此类规范。

本文可以看作《阿》的简化版,只筛选出了上述定义的规范,对于一些只是增强代码可读性的规范,还请参考《阿》原文

命名风格

Java中的内部类是以Father&Son.class命名的,特定情况下,使用$会产生编译错误

OOP规约

直接通过类名引用静态变量,会在编译时期编译成字面量,放到类自身的常量池中

名副其实的大坑,笔者曾经调了好久才找到这个bug,记忆犹新

一般都很少注意这个值吧,或者项目中用json传递数据,不受这个影响

构造函数中的业务逻辑,会在子类的构造函数中调用,应该手动init()

笔者碰到的生产问题:如果接到的报文是一个xml,只有其中一个值有用,通常会做简单处理,即:
xml.split("<a>|</a>");
标签<a>在中间和结尾处返回的数组大小是不一样的,原因同上

大部分朋友唯一用到final的地方就是常量,其实还有这么多的场景可以使用,让程序更加易读

集合处理

不按本条规则,你的HashMap最终可能只是一颗红黑树(JDK1.8起)

看似很绕,其实很容易理解,<? extents T> ,集合内部都是T的子类,add的时候不能保证类型一致,同理,<? super T> get的时候,不知道返回的是什么类型

一试便知

Comparator源码中返回值的定义如下,等于时返回0
* @return a negative integer, zero, or a positive integer as the
* first argument is less than, equal to, or greater than the
* second.

并发处理

问题在于helper=new Helper();
该操作需要三步:
1. 分配对象的内存空间
2. 初始化对象
3. 设置helper指向刚分配的内存地址
其中2和3可能会被虚拟机重排序,导致其他线程看到一个还未被初始化的helper,从而出现问题。
在标红处加上volatile可以避免重排序
参考《Java并发编程的艺术》3.8章 “双重检查锁定与延迟初始化”

volatile仅仅是解决了内存可见问题,线程在更新volatile时,会更新到主内存(这里指堆中的线程共享空间,与TLAB(ThreadLocalAllocationBuffer对应)),和锁、原子性没有任何关系

控制语句

虽然这是一个提高代码可读性的规范,但实在忍不住推荐出来,如果所有的复杂if都采用这条规范,那么世界将是多么的美好

其他

定义在类中,用static修饰,可以参考我的这篇文章《JAVA中final、static、volatile在字节码文件中的表现》,帮助理解satic的意义

异常处理

catch完,起码要打个log吧?catch住什么都不做,出错的时候会让人抓狂

索引规约

总结

本文筛选了《阿里巴巴Java开发手册》中一部分比较有意思的规范,强烈建议读者下载完整电子版通读

目录
相关文章
|
15天前
|
监控 JavaScript 前端开发
《理解 WebSocket:Java Web 开发的实时通信技术》
【4月更文挑战第4天】WebSocket是Java Web实时通信的关键技术,提供双向持久连接,实现低延迟、高效率的实时交互。适用于聊天应用、在线游戏、数据监控和即时通知。开发涉及服务器端实现、客户端连接及数据协议定义,注意安全、错误处理、性能和兼容性。随着实时应用需求增加,WebSocket在Java Web开发中的地位将更加重要。
|
2月前
|
NoSQL Java 关系型数据库
凭借Java开发进阶面试秘籍(核心版)逆流而上
最近参加了面试或者身边有朋友在面试的兄弟有没有发现,现在的面试不仅会问八股文,还会考察框架、项目实战、算法数据结构等等,需要准备的越来越多。 其实面试的时候,并不是要求你所有的知识点都会,而是关键的问题答到点子上!这份《Java 开发进阶面试秘籍(核心版)》由 P8 面试官整体把控,目前已经更新了 30 万字! 资料中涵盖了一线大厂、中小厂面试真题,毕竟真题都是技术领域最经典的基础知识和经验沉淀的汇总,非常有必要学习掌握!双重 buff 叠加,offer 接到手软~ 点击此处取,这可能是你到目前为止领取的最具含金量的一份资料! 整套资料涵盖:Spring、Spring
|
1月前
JavaWeb 开发之 ServletContext 的和使用
JavaWeb 开发之 ServletContext 的和使用
21 1
|
8天前
|
运维 NoSQL 算法
Java开发-深入理解Redis Cluster的工作原理
综上所述,Redis Cluster通过数据分片、节点发现、主从复制、数据迁移、故障检测和客户端路由等机制,实现了一个分布式的、高可用的Redis解决方案。它允许数据分布在多个节点上,提供了自动故障转移和读写分离的功能,适用于需要大规模、高性能、高可用性的应用场景。
15 0
|
9天前
|
人工智能 小程序 Java
JAVA开发智慧学校系统源码+人脸电子班牌布局
智慧校园是通过利用物联网,大数据技术来改变师生和校园资源相互交互的方式,以便提高交互的明确性、灵活性和响应速度,从而实现智慧化服务和管理的校园模式。
|
15天前
|
XML JSON JavaScript
使用JSON和XML:数据交换格式在Java Web开发中的应用
【4月更文挑战第3天】本文比较了JSON和XML在Java Web开发中的应用。JSON是一种轻量级、易读的数据交换格式,适合快速解析和节省空间,常用于API和Web服务。XML则提供更强的灵活性和数据描述能力,适合复杂数据结构。Java有Jackson和Gson等库处理JSON,JAXB和DOM/SAX处理XML。选择格式需根据应用场景和需求。
|
16天前
|
前端开发 Java API
构建RESTful API:Java中的RESTful服务开发
【4月更文挑战第3天】本文介绍了在Java环境中构建RESTful API的重要性及方法。遵循REST原则,利用HTTP方法处理资源,实现CRUD操作。在Java中,常用框架如Spring MVC简化了RESTful服务开发,包括定义资源、设计表示层、实现CRUD、考虑安全性、文档和测试。通过Spring MVC示例展示了创建RESTful服务的步骤,强调了其在现代Web服务开发中的关键角色,有助于提升互操作性和用户体验。
构建RESTful API:Java中的RESTful服务开发
|
20天前
|
存储 安全 Java
【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实战指南(不可变集合篇)
【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实战指南(不可变集合篇)
30 1
|
20天前
|
Java API Apache
【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实战指南(基础编程篇)
【Java技术专题】「Guava开发指南」手把手教你如何进行使用Guava工具箱进行开发系统实战指南(基础编程篇)
43 0
|
29天前
|
Java API 计算机视觉
java实现人脸识别V3版本开发
java实现人脸识别V3版本开发
17 0