• java goodcoder的一些反思!编码思维杂谈


    正好洗完澡,有空就把这个坑填了。

    说道百度的编码规范,确实能从严谨性锻炼人的思维。

    先谈一下背景吧。百度有一个代码规范考试,需要你提交一份符合考试要求的代码,之后会有两审去给你提出意见。

    这次我通过的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)

  • 相关阅读:
    Redis基础用法
    SpringCloud
    Excel数据导入数据库
    MySQL数据库汇总
    Java8stream表达式
    LocalDateTime&LocalDate&LocalTime
    深入理解Java中的锁
    数据集合
    平台介绍
    dubbo源码阅读之自适应扩展
  • 原文地址:https://www.cnblogs.com/hexie/p/4911108.html
Copyright © 2020-2023  润新知