云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍

简介: 本文带大家简单理解阿里巴巴Java开发手册中的规约内容以及P3C项目,可以帮助开发者扫描出所有潜在的代码隐患。在中间也聊了一些对于不同语言设计的理解,如何去看待语言的设计,其实是我们去学习一个语言的核心。
本文带大家简单理解阿里巴巴Java开发手册中的规约内容以及P3C项目,可以帮助开发者扫描出所有潜在的代码隐患。在中间也聊了一些对于不同语言设计的理解,如何去看待语言的设计,其实是我们去学习一个语言的核心。

演讲嘉宾简介:
澳明,阿里巴巴高级开发工程师。


以下内容根据演讲嘉宾视频分享以及PPT整理而成。

本次的分享主要围绕以下三个方面:

一、手册简介
二、聊聊语言
三、P3C项目

一、手册简介
下面主要从三个方面介绍阿里巴巴为什么需要这个Java开发手册。第一个方面,其实是协作效率的问题。众所周知,秦朝统一时期,推出了“车同轨,书同文”的法令,事实上,这个法令背后的目的是让整个国家人民做事的方式进行统一。那么在现在,比如对于一个公司而言,一些规范的不一致可能会导致很多问题,不仅仅是个人与个人之间,甚至让部门与部门之间会出现不必要的沟通损耗和沟通壁垒。
第二个方面其实是在系统质量方面。在阿里巴巴,这种不规范编码导致的线上故障非常非常多,在整个线上故障的比率也非常高。所以,阿里巴巴希望能够统一整个集团的编码规范,进而能够提升整体的系统质量。
第三个方面,工匠精神。阿里巴巴希望工程师们具备一个工匠精神。即希望工程师非常非常认真的对待编码过程及编码产物。因为无论怎么样设计Java开发手册,它所包含的条目始终是有限的,是一个死的东西,更多的希望大家能够体会的是Java开发手册背后的思想,因为背后的思想其实是可以举一反三,灵活运用的。阿里巴巴希望工程师们可以具备这样一种工匠精神,能够不断的认真打磨好自己的代码。
7f08302bcf2087324e6c54c87633b70ba281c1e8
目前,Java开发手册分为七大部分,下图中的七大部分在日常的开发中是非常通用的。大家可以依据这七条规约,逐步逐步的从第一条规约低阶往高阶去进展。与大家平时开发项目一样,比如说,在最开始编码时,可以参考编程规约;然后我们在编程过程中,考虑异常场景时,那么可以考虑异常日志规约;在写单元测试时,可以参考单元测试规约;比如说,在整体的架构设计完毕并且代码开发完毕之后,对于其非功能性需求,比如安全方面的问题,可以参考安全规约;那么在与数据库进行交互时,可以参考MySQL数据库规约;有的时候,在整个一个大的公司内部,希望大家的工程结果能够统一,这样的话大家在阅读别人的代码,或者说复用别人的代码的时候会非常的直观和方便,这时候可以参考工程规约;最后一个设计规约,指在设计软件,设计程序和设计架构时可以参照一些规约。
9ea65369d5edf5537e75e1022901ecd65cf2a6f0
尽管我们的Java开发手册页数不是很多,之所以称之为手册,是希望大家方便阅读,可以当做枕边书,业余时间翻一翻。手册中除了一些制定的规约内容,还提到了很多工程师会遇到的问题场景。这些问题场景中有一部分也结合了阿里巴巴近年来的真实案例,目的是让大家能够更好的理解规约,更重要的是理解规约背后的所体现的思想。这本Java开发手册虽然不厚,但是相信对于刚入门学习Java的同学,可以尝试阅读并体会,肯定会对大家有所帮助,并在编程规范的形成上有很大提高。

二、聊聊语言
1.面向对象语言与面向过程语言的区别
大家应该知道Java是面向对象的语言,也叫做OOP。那么面向对象语言和面向过程的语言有什么区别呢?在实现某个动作时,无论是使用面向对象语言或者面向过程的语言都可以实现,那么为什么说面向过程比较直观,比较方便呢?下面来简单举例说明。首先确定需求,比如说想开一个门,在面向过程的程序设计里,很有可能是一个Open行为或者叫Open函数的一个动作的实现,然后Open依赖的数据结构是Door对象,那么这个开门的动作就非常简单,直接Open the door。在面向对象的程序中,直接将对象Door设计出来,然后在赋予对象一些行为,如Open。
Open the door,这是面向过程的代码,可以认为Door其实是一个数据结构,我们可以很方便的再添加面向过程的代码,如添加新函数,比如Close the door。那么在面向对象的代码中,更多的是在不同的数据结构中,实现Open这一功能。简而言之,面向对象的语言更希望把操作的行为附加在不同的抽象类之上。
下图中摘抄了我们的一本书,《代码整洁之道》中的一段话“面向过程的代码便于在不改动既有数据结构的前提下添加函数,面向对象代码便于不改动既有函数的前提下添加类。反之,过程式代码难以添加新数据结构,面向对象代码难以添加新函数,因为必须修改所有类。对于面向对象比较南的事情,对于面向过程的代码比较容易,反之亦然。”
6c1826f86c2ce32b4ce52a11d7d5a822bd7eaed8

2.异常行为
我们相信大多数开发者都可以写出能够正常运行的代码,这是大家非常非常擅长做的事情。但是并不是所有的开发者都能够把异常处理的非常非常好。因为大家喜欢写按既定的流程能够正确执行的程序,但往往忽略了很多异常的情况。下面带大家从Java语言方面尝试理解一下它是如何对于异常行为进行抽象和设计的。举个简单例子,从旅游坐飞机说起,正常的流程应该是坐飞机起飞,那么想象一下中途有哪些异常场景出现。第一种情况,机场被恐怖份子袭击发生爆炸,虽然机率非常低,但也有可能发生。这种情况相当于发生非常严重的错误,对应在平时开发过程中,其实是系统级别的异常,比如磁盘坏掉,机器宕掉,网络断掉。第二种,假设机场是OK的,但是在去机场的路上,突然之间道路出现拥堵的情况,本来30分钟的路程,额外增加了1个小时的时间,所以必须换成其他交通工具赶到机场。这种相当于编程时异常,这类异常是可以有一些补救的措施的,如刚刚的场景中换成其他交通工具,从而继续让程序表现出我们理想的行为。系统异常与之不同的是,系统异常场景中开发者是没有补救方法的,几乎是无能为力的。第三种情况,假设顺利到达机场,但是护照被拒签无法登机,与上面几种异常不同的是,这种护照被拒签是可以被预测到的,大家都知道是有这种可能的,这种异常场景叫做预检时场景。最后一种,在登机口准备登机时扫描器发生故障,虽然这种异常也算作突发异常,但是是可以登机的。因为这种异常最终会以一种信息方式让机场的维修师会来解决,或者换另一个登机口登机,这类异常叫做可透出异常。
在Java中出现的异常其实可以对上上面的四种异常。首先,第一层级会被抽象为错误和异常,然后异常分为检查异常和未检查异常。大家如果把Java中的异常跟图中的异常进行结合,相信大家会有一些新的输入和理解。
593b3d552599cf7dbf64222ab9aaa7a44c205fcb


三、P3C项目
大家可能会困惑P3C到底是什么?实际上,P-3C是世界知名反潜机,它有美国克洛希德公司在民用客机的基础上改进而来,绰号“猎户”。“猎户”诞生至今已经40多年了,尽管是一员老将,但在海湾战争中,它还是披挂上阵,为多国部队提供了大量情报。因为它是非常经典的反潜机,所以阿里巴巴也以它作为项目的代号,其中的寓意是以Java开发手册为前提扫描出所有潜在的代码隐患。那么阿里巴巴为何要成立这个项目?主要原因是因为如果单纯地制定了Java开发手册里面的一些规范,它其实是类似于意识形态上的东西,飘在空中,通过口头传达这些规范很难落地,仍然无法保证在开发过程中,不会再犯此类错误。所以在阿里巴巴内部,当时成立了P3C项目组,希望依托于Java开发手册,能够把内容,以及平时的扫描,还有IDE进行一些集成的工作,从而让我们的开发人员能够保证遵循我们的Java开发手册进行工作。
下图中给出了P3C项目地址,放在了Github上。其中主要包含三个部分,第一部分是就是开发手册的扫描问题的实现,是基于PMD实现的。第二部分是IntelliJ IDEA plugin,是一个Java IDE的插件。第三部分是Eclipse的插件。插件的部分会实时的在开发过程中,扫描出的代码中不满足Java开发手册内容的一些代码。
P3C项目目前非常火爆,在刚刚宣布了开源之后,整个社区活跃度是非常之高的。推荐大家也访问一下P3C项目,首先大家可以下载都自己的IDE中集成起来,这样会对大家平时编码的规范性有个很好的督促作用,另外这里也给出了Java开发手册的在线免费下载版本和淘宝购买地址。
9e161495af0508647fa0d6fd581945bfd6bdf772

本文由云栖志愿小组董黎明整理,编辑百见
目录
打赏
0
0
0
0
168
分享
相关文章
|
1月前
|
【Java并发】【线程池】带你从0-1入门线程池
欢迎来到我的技术博客!我是一名热爱编程的开发者,梦想是编写高端CRUD应用。2025年我正在沉淀中,博客更新速度加快,期待与你一起成长。 线程池是一种复用线程资源的机制,通过预先创建一定数量的线程并管理其生命周期,避免频繁创建/销毁线程带来的性能开销。它解决了线程创建成本高、资源耗尽风险、响应速度慢和任务执行缺乏管理等问题。
166 60
【Java并发】【线程池】带你从0-1入门线程池
|
16天前
|
【Java并发】【synchronized】适合初学者体质入门的synchronized
欢迎来到我的Java线程同步入门指南!我不是外包员工,梦想是写高端CRUD。2025年我正在沉淀中,博客更新速度加快,欢迎点赞、收藏、关注。 本文介绍Java中的`synchronized`关键字,适合初学者。`synchronized`用于确保多个线程访问共享资源时不会发生冲突,避免竞态条件、保证内存可见性、防止原子性破坏及协调多线程有序访问。
50 8
【Java并发】【synchronized】适合初学者体质入门的synchronized
|
16天前
|
《从头开始学java,一天一个知识点》之:数组入门:一维数组的定义与遍历
**你是否也经历过这些崩溃瞬间?** - 看了三天教程,连`i++`和`++i`的区别都说不清 - 面试时被追问"`a==b`和`equals()`的区别",大脑突然空白 - 写出的代码总是莫名报NPE,却不知道问题出在哪个运算符 这个系列就是为你打造的Java「速效救心丸」!我们承诺:每天1分钟,地铁通勤、午休间隙即可完成学习;直击痛点,只讲高频考点和实际开发中的「坑位」;拒绝臃肿,没有冗长概念堆砌,每篇都有可运行的代码标本。明日预告:《多维数组与常见操作》。 通过实例讲解数组的核心认知、趣味场景应用、企业级开发规范及优化技巧,帮助你快速掌握Java数组的精髓。
57 23
【Java并发】【AQS】适合初学者体质的AQS入门
AQS这是灰常重要的哈,很多JUC下的框架的核心,那都是我们的AQS,所以这里,我们直接开始先研究AQS。 那说到研究AQS,那我们应该,使用开始说起🤓 入门 什么是AQS? AQS(Abst
29 8
Java中的字符集编码入门-增补字符(转载)
本文探讨Java对Unicode的支持及其发展历程。文章详细解析了Unicode字符集的结构,包括基本多语言面(BMP)和增补字符的表示方法,以及UTF-16编码中surrogate pair的使用。同时介绍了代码点和代码单元的概念,并解释了UTF-8的编码规则及其兼容性。
121 60
Java网络编程,多线程,IO流综合小项目一一ChatBoxes
**项目介绍**:本项目实现了一个基于TCP协议的C/S架构控制台聊天室,支持局域网内多客户端同时聊天。用户需注册并登录,用户名唯一,密码格式为字母开头加纯数字。登录后可实时聊天,服务端负责验证用户信息并转发消息。 **项目亮点**: - **C/S架构**:客户端与服务端通过TCP连接通信。 - **多线程**:采用多线程处理多个客户端的并发请求,确保实时交互。 - **IO流**:使用BufferedReader和BufferedWriter进行数据传输,确保高效稳定的通信。 - **线程安全**:通过同步代码块和锁机制保证共享数据的安全性。
68 23
|
25天前
|
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
当我们创建一个`ThreadPoolExecutor`的时候,你是否会好奇🤔,它到底发生了什么?比如:我传的拒绝策略、线程工厂是啥时候被使用的? 核心线程数是个啥?最大线程数和它又有什么关系?线程池,它是怎么调度,我们传入的线程?...不要着急,小手手点上关注、点赞、收藏。主播马上从源码的角度带你们探索神秘线程池的世界...
94 0
【源码】【Java并发】【线程池】邀请您从0-1阅读ThreadPoolExecutor源码
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
139 14
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
62 13
【JAVA】封装多线程原理
Java 中的多线程封装旨在简化使用、提高安全性和增强可维护性。通过抽象和隐藏底层细节,提供简洁接口。常见封装方式包括基于 Runnable 和 Callable 接口的任务封装,以及线程池的封装。Runnable 适用于无返回值任务,Callable 支持有返回值任务。线程池(如 ExecutorService)则用于管理和复用线程,减少性能开销。示例代码展示了如何实现这些封装,使多线程编程更加高效和安全。