温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何优化jdk代码

发布时间:2020-06-05 20:39:08 来源:亿速云 阅读:315 作者:Leah 栏目:编程语言

如何优化jdk代码?相信大部分人都还没学会这个技能,为了让大家学会,给大家总结了这篇文章,下面我们一起来看看jdk代码的优化方案吧。

思考

最近在看concurrent包下线程池的源码,当我看到ThreadPoolExecutor类的时候,发现了JDK源码的一个问题。以下是ThreadPoolExecutor类的addWorker方法的代码片段:

如何优化jdk代码

这段代码的功能是完全没有问题的,但是如果使用卫语句,代码的可读性就会更高了。那么什么是卫语句呢?


什么是卫语句?

条件表达式通常有两种表现形式,第一种形式是:所有分支都属于正常行为;第二种形式则是:条件表达式提供的答案中只有一种是正常行为,其他都是不常见的情况。这两类条件表达式有不同的用途,这一点应该通过代码表现出来。

如果两条分支都是正常行为,就应该使用形如if...else...的条件表达式;如果某个条件极其罕见,就应该单独检查该条件,并在该条件为真时立刻从函数中返回。这样的单独检查常常被称为“卫语句”(guard clauses)。只看概念干巴巴的,不好理解,我们来举两个例子。


条件检查替换

这是一个计算员工薪资的方法,其中以特殊规则处理驻外员工和退休员工的薪资。这些情况不常有,但的确会偶尔出现。

如何优化jdk代码

这段代码中,非正常情况的检查掩盖了正常情况的检查,所以应该用卫语句来取代这些条件检查,以提高程序清晰度。对于每个检查,放进一个卫语句。卫语句要不就从函数中返回,要不就抛出一个异常。

如何优化jdk代码

反转条件替换

这是一个已知长宽高求长方体体积的方法,但有个特殊的需求:高大于0时,打印万猫学社。(惊不惊喜?意不意外?突不突兀?变不变态?是的,有时候我们接到的需求就是这样的。)代码是这样的:

如何优化jdk代码

还是用卫语句替换条件检查,但是我们需要将相应的条件反转过来,也就是做逻辑非运算。

如何优化jdk代码

为什么要使用卫语句?

卫语句的精髓是:给某一条分支以特别的重视。如果使用if...else...结构,你对if分支和else分支的重视是同等的。这样的代码结构传递给阅读者的消息就是:各个分支有同样的重要性。

卫语句就不同了,它告诉阅读者:“这种情况很罕见,如果它真的发生了,请做一些必要的整理工作,然后退出。”如果对方法剩余部分不再有兴趣,当然应该立刻退出。引导代码的阅读者去看一个没有用的else区段,只会妨碍他们的理解。用了卫语句以后,代码更容易被理解,被维护。


优化JDK代码

看了上面的讲解,addWorker方法的代码片段就可以优化为:

boolean workerStarted = false;boolean workerAdded = false; Worker w = null;try {    w = new Worker(firstTask);    final Thread t = w.thread;    if (t == null) {//卫语句        return workerStarted;    }    final ReentrantLock mainLock = this.mainLock;    mainLock.lock();    try {        int rs = runStateOf(ctl.get());        //卫语句        if (rs > SHUTDOWN || (rs == SHUTDOWN && firstTask != null)) {            return workerStarted;        }        if (t.isAlive())// precheck that t is startable            throw new IllegalThreadStateException();        workers.add(w);        int s = workers.size();        if (s > largestPoolSize)            largestPoolSize = s;        workerAdded = true;    } finally {        mainLock.unlock();    }    if (workerAdded) {        t.start();        workerStarted = true;    } } finally {    if (!workerStarted)        addWorkerFailed(w); }return workerStarted;

修改后的代码,理解起来是不是更容易了?假如再加入新的功能,可以更容易修改代码。


关于jdk代码的优化方案就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI