正好洗完澡,有空就把这个坑填了。
说道百度的编码规范,确实能从严谨性锻炼人的思维。
先谈一下背景吧。百度有一个代码规范考试,需要你提交一份符合考试要求的代码,之后会有两审去给你提出意见。
这次我通过的java,从这次考试分如下几点谈一谈:
一。代码的质量:线程安全,同步问题,异常处理,设计模式一类一类的
以下还是用我自己代码来说明吧!
单例模式:
举个例子:
这个地方是要实现单例,让整个系统中只存在一个MessageCenter,从下图可以看到我创建一个私用成员变量messageCenter,
同时实现了一个私有的构造函数,保证调用MessageCenter类只能使用getInstance()去创建(唯一入口)
然后回到第一张图,评审人提出来的问题是:同步问题。其实这个一开始我很困惑,我已经加了synchronized
去进行同步。(这里可以这样理解,就从我目前的能力来看)句子内加了synchronized(class)代表了在这个class
里面获取了一个互斥锁mutex,之后整个代码块{}结束了之后释放互斥锁。
假如学过python的话可以这样理解:
with threading.Lock():
something todo
回到问题,我已经构建了添加单例的代码块为synchronized,那为何还有同步问题?
其实查询了一下单例模式的例子,不难发现其实我还是少了一个null的判断,代码如下:
在synchronized代码块里面还有一个判断messageCenter为空?这是为何?
这个具体的描述还是看看单例模式的那篇文章吧,双重null判断的含义不同,前者是为了让已存在了单例后不需要去在
创建浪费很多时间,后者则是避免在A进程执行sychronized模块(创建MessageCenter对象的时候),又有一个进程B请求了
互斥锁,虽然没进去在外面等待,但是等A执行完毕释放了互斥锁,B之后的步奏就是做和A一样的事情,在创建一次。结果:单例失败!
谈一下对自定义异常
首先为什么要自定义异常?
主要原因是Java提供的异常类在还是不能很好的阐述异常发生的原因(虽然内置的异常类型已经够多了)
从我下面的这个截图来阐述吧!首先我声明了一个自定义异常 MessageNotFindHandlerException
从名字就能很清楚的了解,消息找不到处理器(这句话其实可以说从业务的这个纬度去表诉的,那是不是也可以理解为自定义异常
可以很好的描述业务逻辑的异常,使程序可读性更强也更有健壮性)
我这个异常继承了一个RuntimeException(运行时异常导致运行不了)
从评审的角度来看,缺少包装异常,那什么是包装异常?
其实我弄了很久都没弄明白,后面找评审人,评审人只打开了Exception类的实现,我就大概了解该去改什么了!
很明显我们能看到对于Exception 起码存在三个构造函数 Exception() Exception(String message) Exception(String message, Throwable cause)