Java程序员面试复习手册

阿里巴巴Java开发手册阅读笔记

2019-02-07  本文已影响0人  蛮三刀酱

前言

参考:阿里巴巴Java开发手册V1.3.0

总结比较重要的,对面试有用的开发规约

一、编程规约

(一)命名风格

反例:定义为基本数据类型 Boolean isDeleted;的属性,它的方法也是 isDeleted(),RPC
框架在反向解析的时候,“以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。

public class OrderFactory;

public class LoginProxy;

public class ResourceObserver;

(二)常量定义

反例:String key = "Id#taobao_" + tradeId;

cache.put(key, value);

正例:public Enum { MONDAY(1), TUESDAY(2), WEDNESDAY(3), THURSDAY(4), FRIDAY(5), SATURDAY(6),
SUNDAY(7);}

(三)代码格式

(四)OOP 规约

说明:对于 Integer var = ? 在-128 至 127 范围内的赋值,Integer 对象是在IntegerCache.cache 产生,会复用已有对象,这个区间内的 Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用 equals 方法进行判断。

说明:注意 serialVersionUID 不一致会抛出序列化运行时异常。

说明:在方法执行抛出异常时,可以直接调用 POJO 的 toString()方法打印其属性值,便于排
查问题。

说明:反编译出的字节码文件显示每次循环都会 new 出一个 StringBuilder 对象,然后进行
append 操作,最后通过 toString 方法返回 String 对象,造成内存资源浪费。

反例:

String str = "start";
for (int i = 0; i < 100; i++) {
str = str + "hello";
}

(五)集合处理

说明:String 重写了 hashCode 和 equals 方法,所以我们可以非常愉快地使用 String 对象
作为 key 来使用。

说明:subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList ,而是
ArrayList 的一个视图,对于 SubList 子列表的所有操作最终会反映到原列表上。

反例:直接使用 toArray 无参方法存在问题,此方法返回值只能是 Object[]类,若强转其它
类型数组将出现 ClassCastException 错误。

说明:asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。Arrays.asList
体现的是适配器模式,只是转换接口,后台的数据仍是数组。
String[] str = new String[] { "you", "wu" };
List list = Arrays.asList(str);

第一种情况:list.add("yangguanbao"); 运行时异常。

第二种情况:str[0] = "gujin"; 那么 list.get(0)也会随之修改。

在这里插入图片描述

(六)并发处理

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

说明:Random 实例包括 java.util.Random 的实例或者 Math.random()的方式。

正例:在 JDK7 之后,可以直接使用 API ThreadLocalRandom,而在 JDK7 之前,需要编码保
证每个线程持有一个实例。

(七)控制语句

说明:如果非得使用 if()...else if()...else...方式表达逻辑,【强制】避免后续代码维
护困难,请勿超过 3 层。
正例:超过 3 层的 if-else 的逻辑判断代码可以使用卫语句、策略模式、状态模式等来实现,
其中卫语句示例如下:

public void today() {
 if (isBusy()) {
System.out.println(“change time.”);
 return;
 }
 if (isFree()) {
System.out.println(“go to travel.”);
 return;
 }
 System.out.println(“stay at home to learn Alibaba Java Coding Guidelines.”);
 return;
}

(八)注释规约

(九)其它

说明:如果 var=null 或者不存在,那么${var}会直接显示在页面上。

二、异常日志

(一)异常处理

正例:if (obj != null) {...}

反例:try { obj.method() } catch (NullPointerException e) {...}

(二)日志规约

三、单元测试

四、安全规约

五、MySQL 数据库

(一) 建表规约

(二) 索引规约

正例:能够建立索引的种类:主键索引、唯一索引、普通索引,而覆盖索引是一种查询的一种
效果,用 explain 的结果,extra 列会出现:using index。

正例:如果 where a=? and b=? ,a 列的几乎接近于唯一值,那么只需要单建 idx_a 索引即
可。

(三) SQL语句

(四)ORM 映射

六、工程结构

(一)应用分层

在这里插入图片描述

(二)二方库依赖

(三)服务器

关注我

我是蛮三刀把刀,目前为后台开发工程师。主要关注后台开发,网络安全,Python爬虫等技术。

来微信和我聊聊:yangzd1102

Github:https://github.com/qqxx6661

原创博客主要内容

个人公众号:Rude3Knife

个人公众号:Rude3Knife

如果文章对你有帮助,不妨收藏起来并转发给您的朋友们~

上一篇下一篇

猜你喜欢

热点阅读