《阿里巴巴Java开发手册v1.2》解析(编程规约篇)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 之前在乐视天天研究各种底层高大上的东西,因为我就一个人,想怎么弄怎么弄。如今来了新美大,好好研读一下《阿里巴巴Java开发手册v1.2》。还要对这么看似简单的东西解析一番。毕竟现在带团队,讲究团队合作。现在项目稍微有点乱,早统一,代价越低。别问我乐视是不是不行了。乐视好的很,已经到了谷底,该反弹了,看好乐视。我离开是因为自己的技术瓶颈,要是乐视像去年发展的那么好,我估计离开的更早。

 之前在乐视天天研究各种底层高大上的东西,因为我就一个人,想怎么弄怎么弄。如今来了新美大,好好研读一下《阿里巴巴Java开发手册v1.2》。还要对这么看似简单的东西解析一番。毕竟现在带团队,讲究团队合作。现在项目稍微有点乱,早统一,代价越低。别问我乐视是不是不行了。乐视好的很,已经到了谷底,该反弹了,看好乐视。我离开是因为自己的技术瓶颈,要是乐视像去年发展的那么好,我估计离开的更早。


  我自己本身其实就是不怎么讲究章法的人。也没打算拿什么去约束大家。我跟领导谈学习这个手册的事情。领导比较担心的是怎么落地。我回家跟我家男神讨论,他也说章法的东西没有强制约束就不会有效果。所以我家男神他们公司都用统一的模板,统一的软件,还有专门的QA对于规范不合格的要打回去重改。一个初创的创业公司尚且如此,咱们美团确实不能落后啊。但是这种实行起来确实耗时耗力,也没有很大的必要。我主要想达到的效果是:领导把组织技术分享这件事情交给我了,那我就需要对大家的技术成长负责。这是个长期的过程,现在大家都很忙,每周一个技术分享大家前期没有时间准备,但是如果技术分享这件事情一旦断掉,持续性得不到保证,技术成长和学习就很难形成一个习惯。所以前期打算学习一些看起来很简单,压力不是很大的事情,一次学习一点,大家也不用准备,一周一个小时现在学即可。而且工作中确实存在一些这样那样的小问题。会议过程中总体学习完一遍之后,每个人都需要对目前自己编程过程中做的不是很到位的,或者有特别感触的至少提出一点来。我想领导说的seminar的思想,也就是希望大家都有自己的思考。


  学这个东西都自身的提高到底有什么好处。举一个例子:我之前学心理学的时候我们老师说他去美国的时候发现美国佬自己说话也不讲究语法。他就想那为什么我们学习的就需要各种时态用的那么准确呢。后来他去美国的学校,发现大学教授们各种时态语法用的甚是地道。原来这是素养的体现。后来我自己去美国,美国人很热情的,大街上经常有不认识的人对面走过来就打招呼,发现你很爱聊天的话,还会停下来唠一唠。如果他们说话不讲语法,我理解起来就很费劲,可能还需要他们重复一遍。我最不爱去商场购物的地方。因为经常有人拉着我讨论各种品牌,我对牌子的东西一窍不通,我身上穿的用的都不是什么高档的东西。要说我身上唯一值钱的,就只有我自己了。总之,他们说话语法不规范,不是标准的语法,还带着口音,还有各种生词,聊天那叫一个费劲。写代码也一样,不规范只是让代码难懂一点点,但是再加上不了解业务逻辑,代码构成等等,总体就会很晦涩。晦涩或易懂最终决定了素养。


一· 编程规约


(一)命名风格


 1. 【强制】代码中的命名均不能以“下划线”或“美元符号”开始,也不能以“下划线”或“美元符号”结束。


 2.【强制】代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。


 3.【强制】类名使用UpperCamelCase风格,必须遵从驼峰形式,但以下情形例外:DO/BO/DTO/VO/AO


解析:


  DO是(Domain Object):领域对象,就是从现实世界中抽象出来的有形或者无形的业务实体。


  BO是(Bussiness Object):业务对象,封装业务逻辑的java对象,通过调用DAO方法,结合PO,VO进行业务员操作。


  DTO是(Data Transfer Object):数据传输对象,是一种设计模式之间传输数据的,一般需要序列化。


  VO是(View Object):视图对象,用于展示层。


  AO是(Activation Object):活动对象,一种基于消息机制,异步调用,现成安全的对象。


 4.【强制】方法名,参数名,成员变量,局部变量都统一使用lowerCanelCase风格,必须遵从驼峰形式。


 5.【强制】常量命名全部大写,单词间用下划线隔开,力求语义表达完整清楚,不要嫌名字长。


 6.【强制】抽象类命名使用Abstract或Base开头,异常类命名使用Exception结尾,测试类命名以它要测试的类名称开始,以Test结尾。


 7.【强制】中括号是数组类型的一部分,数组定义如下:String[] args;  反例:使用String args[](这么写的哥哥大概之前是做C的)


 8.【强制】POJO类中布尔类型的变量,都不要加is,否则部分框架解析会引起序列化错误。反例:定义为基本数据类型Boolean isDeleted的属性,它的方法也是isDeleted()。RPC框架在反向解析的时候,辨识为对应的属性名称是deleted,导致属性获取不到。


 9.【强制】包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词,包名统一使用单数形式,但是类名如果有复数含义,类名可以使用复数形式。


 10.【强制】杜绝完全不规范的缩写,避免望文不知义。


 11.【推荐】如果使用了设计模式,建议在类名中体现出具体模式。


 12.【推荐】接口类中的方法和属性不要加任何修饰符号(public也不要加),保持代码的简洁性,并加上有效的Javadoc注释。尽量不要在接口里定义变量,如果一定要定义变量,肯定是与接口方法相关,并且是整个应用的基础常量。


 13. 接口和实现类的命名有两套规则:


  1)【强制】对于Service和DAO类,基于SOA的理念,暴露出来的服务一定是接口,内部的实现类用Impl的后缀与接口区别。


  2)【推荐】如果是形容能力的接口名称,取对应的形容词做接口名(通常是-able的形式)。正例:AbstractTranslator实现Translatable.


解析:SOA(Service-Oriented Architecture)面向服务架构提供了支持业务灵活性的IT灵活性远景,主要是流程实现的分离和简化。现在都是提微服务了。微服务架构模式(Microservices Architecture Pattern)的目的是将大型的,复杂的,长期运行的应用程序构建为一组相互配合的服务,每个服务都可以很容易的局部改良。需要符合SRP原则。SRP(Single Responisbility Principle)单一职责原则。是OO的五大原则之一。其他四个分别是OCP(Closed for Modification;Open for Extension)开闭原则,LSP(Liskov Substitution Priciple)里氏替换原则,DIP(Dependence Inversion Principle)依赖倒置原则,ISP(Interface Segregation Principle)接口隔离原则。


 14.【参考】枚举类名建议带上Enum后缀,枚举成员名称需要全大写,单词间用下划线隔开。说明:枚举其实就是特殊的常量类,且构造方法被默认强制是私有。


 15.【参考】各层命名规约:


  A) Service/DAO层方法命名规约


    1)获取单个对象的方法用get做前缀。

    2)获取多个对象的方法用list做前缀。

    3)获取统计值的方法用count做前缀。

    4)插入的方法用save(推荐)或insert做前缀。

    5)删除的方法用remove(推荐)或delete做前缀。

    6)修改的方法用update做前缀。

  B) 领域模型命名规约


    1)数据对象:xxxDO,xxx即为数据表名。

    2) 数据传输对象:xxxDTO, xxx为业务领域相关的名称。

    3) 展示对象:xxxVO, xxx一般为网页名称。

    4)POJO是DO/DTO/BO/VO的统称,禁止命名成xxxPOJO。


解析:领域模型(Domain Model)也叫业务对象模型。是对领域内的概念类或现实世界中对象的可视化表示。又称概念模型,领域对象模型,分析对象模型。专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系。

 

跑题时间:


  记得从正和岛离职去乐视的时候,离职的最后一天,我坐在座位上,每个路过的人都能看到我笑的那么开心。同事说:你不应该笑啊,应该哭啊。我说:藏起泪眼只用笑容相送。其实离开那个耽误我青春的地方是真的很开心,但是我那时候还需要依赖,只是没有人可以依赖,所以我是真的对着显示器哭了一会儿。离开乐视,我没哭也没笑。我情商依然不高,大家的好我依然没有学的来。但是在这个环境中,大家给了我太多的迁就,所以我需要一个更有挑战的环境,来变成更好的自己。可以说遇到飞哥和我家微微一笑很倾城的男神老大是我工作十年最幸运的事情,没有之一。如今在新美大刚去总是做了一件事就发现做的有问题,说了一句话就发现自己说的不合适的。不过,现在的我却相信我自己,知道一切都会好起来。


  去乐视的时候,我待遇要的很低。HR都不敢跟我提待遇的事情,生怕我后悔了。可知那时候,我确实是不怎么会技术,但是我家男神待遇都不到我的一半。我家男神嫌“用友”离家远,决定换工作,我去替他打听行情。告诉他行情最低是多少。他却生气的告诉我说他不值这个钱。我告诉他不要放弃标准。然后他去面了几家公司,刚面嘛,面的一般,遇到HR压价,更打击了我家男神的自信。去电讯盈科面试,面试官说跟我家男神说这个职位给不了那么多,我家男神合适一个更高的职位。回家我家男神一顿埋怨我,甚至揪着我的衣领说都是我的错。我默默的听着,不辩解,只是坚定的跟他说:不要放弃标准。后来“电讯盈科”打电话给我家男神说有了一个合适的高级职位。虽然给的还是没要的高,而且也还是差不多我当时收入的一半,但是我俩已经很高兴了。其实那时候,论技术,我家男神确实是比我强。只是太过厚道的人就有这个不好的地方,会被忽悠。后来,我要换工作,遇到家里各种阻挠。我家男神不想让我放弃活少还高收入的工作。我家男神不开心,婆婆不开心,会直接导致儿子不开心。儿子骨子里内向,他不开心就一个表现:生病。那时候我上班离得很远,离家60多公里。回到家晚上11点多。儿子不爱吃婆婆做的饭。我回家做好放到冰箱第二天婆婆可以热热。为了让儿子爱吃,1根胡萝卜我切成29个不同的形状。做完饭后半夜2,3点了。为了不让儿子感染病菌,我睡觉前都要把自己放到高锰酸钾消毒水中泡一会儿。第二天还要6点起床去上班。那时候面过了高德,高德给的不高,我家男神不肯让我去。后来面过了58,给的也很低。各种压力打压着我对自己的标准。所以去乐视确实是自己要低了。也是没了解好行情,不过也比之前高点,可以实现我多年国外出差的心愿,离家也近,全家都很高兴了。


  我反省自己,出现这种情况的原因是我没给我家男神足够的自信。婆婆和老公都是对自己要求很低,自信心很低的人。之前我也给了他很多误导。我公司一直比他好,收入比他高。但是我在家都是各种玩。所以他一直也鄙视我的不努力。所以我开始自己努力,同时对他各种鼓励,鼓励我家男神做自己想做的事情,告诉他是最棒的。我家男神也确实越来越有自信,工作也越来越好。乐视出现了一些问题,今年确实没涨工资。如果今年我家男神工资早涨几个月,大概会第一次超过我吧。但是我家男神的待遇都不是跳槽谈来的,是用自己做出的成果证明来的,所以我以我家男神为傲。


  我家微微一笑很倾城的男神老大却是从面试完就觉得我技术好,各方面都不错。其实我哪里技术好,只是那时候面试比较多而已。他天生对人的信任,相信我可以做到一些自己做不到的事情。比如说,今年年初的时候,我自己都不知道自己除了做项目还会做点啥。我家男神老大却相信我可以做更多的事情。我大概真正开始学技术也就是从年初开始。可以说没有我家微微一笑很倾城的男神老大,就没有现在的我。但是我如今羽翼已丰,需要更大的发展空间。如果我感觉压力大的时候,就可以给我家微微一笑很倾城的男神老大发个微信。他会告诉我:“别后悔,别回头,勇敢往前走。”


  那天我说这么多年我都没怎么学技术,要补的太多了。我家男神说:“你看你在东软弄了两年日语,人人网时候你就学历史文学,后来学心理学。” 我满以为他会说你技术差也是正常的。结果他说:“所以你肯定是综合素质最好的”。我家男神已经长大成熟了,今年我换工作期间无论成功失败,都能得到他对我的肯定。再也不会觉得我说的是大话。我俩可以携手去创造奇迹了。

相关文章
|
3天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
15 2
|
7天前
|
Java
轻松上手Java字节码编辑:IDEA插件VisualClassBytes全方位解析
本插件VisualClassBytes可修改class字节码,包括class信息、字段信息、内部类,常量池和方法等。
49 6
|
6天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
4天前
|
存储 算法 Java
Java Set深度解析:为何它能成为“无重复”的代名词?
Java的集合框架中,Set接口以其“无重复”特性著称。本文解析了Set的实现原理,包括HashSet和TreeSet的不同数据结构和算法,以及如何通过示例代码实现最佳实践。选择合适的Set实现类和正确实现自定义对象的hashCode()和equals()方法是关键。
15 4
|
7天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####
|
4天前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
6天前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
18 2
|
8天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
17天前
|
安全 Java
java 中 i++ 到底是否线程安全?
本文通过实例探讨了 `i++` 在多线程环境下的线程安全性问题。首先,使用 100 个线程分别执行 10000 次 `i++` 操作,发现最终结果小于预期的 1000000,证明 `i++` 是线程不安全的。接着,介绍了两种解决方法:使用 `synchronized` 关键字加锁和使用 `AtomicInteger` 类。其中,`AtomicInteger` 通过 `CAS` 操作实现了高效的线程安全。最后,通过分析字节码和源码,解释了 `i++` 为何线程不安全以及 `AtomicInteger` 如何保证线程安全。
java 中 i++ 到底是否线程安全?
|
4天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
23 9

推荐镜像

更多