JAVA基础之代码简洁之道_第1页
JAVA基础之代码简洁之道_第2页
JAVA基础之代码简洁之道_第3页
JAVA基础之代码简洁之道_第4页
JAVA基础之代码简洁之道_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、JAVA基础之代码简洁之道背景软件质量,不但依赖于架构及项目管理,更与代码质量紧密相关。简洁高效的代码不但易于阅读,更能避免潜在BUG与风险,提高代码质量。近期,一位Oracle程序员在Hacker News上吐槽自己的工作,引起了热议。这个工程师的核心痛点是,Oracle经历长期的产品线迭代,代码异常庞大、逻辑复杂,整个代码中充斥着神秘的宏命令。每新增一个特性或者修复BUG,该工程师都需要大量的调研,小心谨慎的进行着日常的工作。而Oracle每次的版本发布都经历数百万次的测试,脑补一下,如噩梦一般。那么我们应该如何编写简洁高效的代码呢?其实业内有过很多相关书籍,比如经典的书籍有代码整洁之道、

2、编写可读代码的艺术、重构:改善既有代码的设计,可用于修炼内功。以及我们有严格的代码规范以及方便的静态代码扫描工具,可用于加强研发代码质量能力。简洁之术其实代码规范和静态代码扫描工具能够帮助我们完成很多代码简洁的工作。诸如:注释、命名、方法、异常、单元测试等多个方面。但却无法总结了一些代码简洁最佳实践,其实Java是面向对象语音,而面向对象的特征是封装、继承、多态,巧妙的运用这三大特性、理解Java的一些关键字特性、语音特性、阅读JDK源码,就可以写出相对简洁的代码了。简化逻辑/ 修改前if(list.size()0) return true; else return false;/ 修改后re

3、turn list.size()0;if/else 语法:if语句包含一个布尔表达式,当if语句的布尔表达式值为false时,else语句块会被执行;return 关键字:返回一个任意类型的值;list.size()0 表达式:list.size()方法本身是一个返回int类型数值的函数,而与0组成了一个布尔表达式;省略无意义赋值局部变量list的数据类型与该方法的返回值类型一致,而多余的变量也将会增加JVM垃圾回收的消耗;局部变量list只是负责接收了mapper.queryList(params)的返回值,而并没有其他逻辑处理;此代码存在于service层和mapper层之间,可以在框架层

4、面进一步抽象,利用注解、java8 default方法等进一步改进;最小化判断代码中if else的存在只是因为sendMessage函数的第二个参数会有两种情况(成功/失败),尽量让判断最小化;set方法治理大坨的set方法很影响代码可读性,可封装成特定方法或者使用lombok工具简化代码;局部变量就近声明,增加可读性,局部变量声明和使用地方距离遥远,会导致的读者频繁滑动;可不声明变量尽量不要声明多余的变量,冗余代码;(如date、time两段代码);巧用JAVA8特性-函数式编程简化代码JAVA8特性“函数式编程”,使用Lambdas我们能做到什么?遍历集合(List、Map等)、Sum、

5、Max、Min、Avg、Sort、Distinct等等函数接口谓词(Predicate)使用实现Map和Reduce实现事件处理/简化多线程内、外部循环上述代码是传统方式的遍历一个List的写法,简单来说主要有3个不足:只能顺序处理list中的数据(process one by one)不能充分利用多核cpu不利于编译器优化(jit)而使用函数式编程能规避上面的三个问题:不一定需要顺序处理List中的元素,顺序可以不确定可以并行处理,充分利用多核CPU的优势有利于JIT编译器对代码进行优化代码看起来更简洁,完全交给编译器内部循环default方法在Java8中,接口中的方法可以被实现,用关键字

6、 default 作为修饰符来标识,接口中被实现的方法叫做 default 方法。使用default方法,当接口发生改变的时候,实现类不需要做改动,所有的子类都会继承 default 方法。当一个接口扩展另外一个包含默认方法的接口的时候,有以下3种处理方式。完全无视默认方法(直接继承上级接口的默认方法)重新申明默认方法为抽象方法(无实现,具体子类必需再次实现该方法)重新实现默认方法(重写了默认方法的实现,依然是一个默认方法)日期处理Java8中新增了LocalDate和LocalTime接口,为什么要搞一套全新的处理日期和时间的API?因为旧的java.util.Date实在是太难用了。jav

7、a.util.Date月份从0开始,一月是0,十二月是11,变态吧!java.time.LocalDate月份和星期都改成了enum,就不可能再用错了。java.util.Date和SimpleDateFormatter都不是线程安全的,而LocalDate和LocalTime和最基本的String一样,是不变类型,不但线程安全,而且不能修改。java.util.Date是一个“万能接口”,它包含日期、时间,还有毫秒数,如果你只想用java.util.Date存储日期,或者只存储时间,那么,只有你知道哪些部分的数据是有用的,哪些部分的数据是不能用的。在新的Java8中,日期和时间被明确划分为L

8、ocalDate和LocalTime,LocalDate无法包含时间,LocalTime无法包含日期。当然,LocalDateTime才能同时包含日期和时间。新接口更好用的原因是考虑到了日期时间的操作,经常发生往前推或往后推几天的情况。用java.util.Date配合Calendar要写好多代码,而且一般的开发人员还不一定能写对。1、Clock时钟。Clock类提供了访问当前日期和时间的方法,Clock是时区敏感的,可以用来取代System.currentTimeMillis(),来获取当前的微秒数。某一个特定的时间点也可以使用Instant类(为Final类)来表示,Instant类也可以

9、用来创建老的java.util.Date对象。2、LocalDate和LocalTime、LocalDateTime(均为Final类,不带时区)的一系列计算。LocalDateTime和Instant两者很像都是不带时区的日期和时间,Instant中是不带时区的即时时间点。比如:两个人都是2018年4月14日出生的,一个出生在北京,一个出生在纽约;看上去他们是一起出生的(LocalDateTime的语义),其实他们是有时间差的(Instant的语义)Streams与集合Stream是对集合的包装,通常和lambda一起使用。使用lambdas可以支持许多操作。如 map,filter,lim

10、it,sorted,count,min,max,sum,collect等等。 同样,Stream使用懒运算,他们并不会真正地读取所有数据。遇到像getFirst()这样的方法就会结束链式语法,通过下面一系列例子介绍:比如我有个Person类,就是一个简单的pojo, 针对这个对象,我们可能有这样一系列的运算需求。传递行为,而不仅仅是传值/sumAll算法很简单,完成的是将List中所有元素相加。public static int sumAll(List numbers) int total = 0; for (int number : numbers) total += number; ret

11、urn total;sumAll算法很简单,完成的是将List中所有元素相加。某一天如果我们需要增加一个对List中所有偶数求和的方法sumAllEven,那么就产生了sumAll2,如下:public static int sumAll2(List numbers) int total = 0; for (int number : numbers) if (number % 2 = 0) total += number; return total;又有一天,我们需要增加第三个方法:对List中所有大于3的元素求和,那是不是继续加下面的方法呢?sumAll3public static int

12、sumAll3(List numbers) int total = 0; for (int number : numbers) if (number 3) total += number; return total;观察这三个方法我们发现,有很多重复内容,唯一不同的是方法中的if条件不一样(第一个可以看成if(true),如果让我们优化,可能想到的第一种重构就是策略模式吧,代码如下:这无疑使用设计模式的方式优化了冗余代码,但是可能要额外增加几个类,以后扩展也要新增,下面看看使用lambda如何实现,声明方法:第一个参数还是我们之前传递的List数组,第二个看起来可能有点陌生,通过查看jdk可以

13、知道,这个类是一个谓词(布尔值的函数)public static int sumAllByPredicate(List numbers, Predicate p) int total = 0; for (int number : numbers) if (p.test(number) total += number; return total; /调用:sumAllByPredicate(numbers, n - true);sumAllByPredicate(numbers, n - n % 2 = 0);sumAllByPredicate(numbers, n - n 3);代码是不是比上面简洁了很多?语义也很明确,重要的是不管以后怎么变,都可以一行代码就修改了。万金油啊。其他JAVA8 还推出了很多特性,来简化代码。比如Str

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论