原文:http://www.javastack.cn/article/2018/10-java-programming-skills-summary/

这是一个国外大神20多年的经验总结出来的……

“任何可能出错的事情,最后都会出错。”

这就是人们为什么喜欢进行“防错性程序设计”的原因。偏执的习惯有时很有意义,有时则不够清晰也不够聪明,也许当你想到这样写的人的时候还会觉得有点怪异。下面是我列出的的个人感觉最有用而又偏执的 10 项 Java 编程技巧。请看:

  1. 把字符串常量放在前面

通过把字符串常量放在比较函数equals()比较项的左侧来防止偶然的 NullPointerException 从来都不是一个坏主意,就像这样:

这是毫无疑问的,把一种表达式转换成另一种更好的表达式,并不会失去什么。只要我们的Options是真实存在的(Java 8中 Optional是对可以为空的对象进行的封装),不是吗?讨论一下…

  1. 不要相信早期的JDK APIs

Java刚出现的时候,编程一定是件很痛苦的事。那时的API仍然不够成熟,你可能曾经遇到过这样一段代码:

看起来很奇怪对吗?也许吧,但是看看这个Javadoc:

“如果抽象路径名表示的不是一个目录,那么这个方法返回null。否则返回一个字符串数组,其中每个字符串表示当前目录下的一个文件或目录。”

是的,最好再加上判空检查,以确保正确:

糟糕!前者违反了 Java 编码中 10 个微妙的最佳实践的规则#5和#6。因此一定要记得判 null检查!

  1. 不要相信“-1”

我知道这很偏执,Javadoc中关于 String.indexOf() 的早期描述是这样的:

“字符在字符序列中第一次出现的位置将作为结果[被返回],如果字符不存在则返回-1。”

所以,-1 就可以理所当然被拿来用,对吗?我说不对,看看这个:

谁知道呢。也许在某个特定场合下他们将会需要另一种 编码值,如果不区分大小写的话,otherString 就会被包含进去…此时或许可以返回 -2呢?谁知道呢。

毕竟,我们有非常多关于NULL——价值亿万美金的错误的讨论。为什么不开始讨论 -1呢,某种意义上来说 -1 是 null 在int类型下的另一种形式。

  1. 避免意外的赋值

是的。即使最优秀的程序员也可能犯这种错误(当然,不包括我。看#7)。

(假设这是JavaScript,我们暂且偏执地认为是这种语言)

再说一遍。如果你的表达式中有常量,将它放在等式左边。这样当你打算再添加一个 = 时,不容易出错。

  1. 检查null和长度

不管什么时候你有一个集合、数组或者其他的,确保它存在并且不为空。

你不知道这些数组来自哪儿,也许是早期的JDK API呢?

  1. 所有的方法都用 final 声明

你可以告诉我任何你想要的开闭原则,不过那都是胡说八道。我不相信你(可以正确继承我的类),也不相信我自己(不会意外地继承我的类)。因此除了接口(专门用于继承)都应该是严格的 final。

是的,写成final。如果这样做对你来说没有意义,你也可以通过修改或重写字节码来改变类和方法,或者发送功能请求。作为Java技术栈公众号小编,我敢肯定的告诉你重写类/方法并不是一个好主意。

  1. 所有的变量和参数都用 final 声明

就像我说的。我不相信自己不会无意间重写了某个值。这么说来,我的确一点都不相信自己。因为:

这也是为什么所有的变量和参数都用final声明的原因。

好吧,我承认,这一条我自己也不常用,虽然我应该用。我希望Java能像Scala语言一样,人们在所有地方都直接用 val 来表示变量,甚至都不考虑易变性,除非明确需要的时候他们才用 var 来声明变量,但是这样的机会特别少。

  1. 重载的时候不要相信泛型

是的,这是会发生的。你觉得你写了一个超好的API,它真的是既酷炫又直观;接着就出现了一群用户,他们只是把一切类型生搬硬套进 Object 中 直到那该死的编译器停止工作,然后他们突然链接到了错误的方法,认为这一切都是你的错(事情总是这样)。

思考一下这个:

因为,你知道的…你的用户们,他们就像这样

相信我,我看过的多了,还有这样的

所以说偏执是有好处的。

  1. 总是在switch语句里加上default

Switch…作为最滑稽的表达式之一,我不知道是该心存敬畏还是默默哭泣。不管怎样,我们既然无法摆脱 switch ,在必要的时候我们最好能够正确使用它,例如:

因为在当 value=3 被引入到软件中的时候,default 就能发挥作用,使其正常运行!别和我提 enum 类型,因为这对 enums 也一样适用。

  1. 用大括号隔开 switch 的每一个 case 块

事实上,switch是最坑爹的语句,任何喝醉了或是赌输了的人都可以在某种语言中使用它。看看下面这个例子:

在switch语句中,为所有的case都只定义了一个作用域。事实上,这些case不是真正意义上的语句,他们更像是标签,而switch就是指向这些标签的goto语句。事实上,你甚至可以把case语句和 惊人的FORTRAN77项声明 类比,对于FORTRAN,它的神秘已经超越了它的功能。

这意味着变量final int j 可以被任何case访问,不论我们是否有break。看起来并不是很直观。我们可以通过添加简单的花括号为每一个case创建一个新的嵌套的作用域,当然不要忘了在每个 case 的语句块最后加 break。

结论

编程时的强迫症有时候看起来会很奇怪,会使得代码往往比必需的还要冗长。你可能会想,“啊,这种情况永远不会发生!”,但是正如我所说的,在经历了20年左右的编程生涯后,你不会想要再去修正那些只是因为编程语言的古老和固有缺陷而导致的愚蠢而不必要的bug了。因为你知道……

现在,轮到你了!

原文: http://www.javacodegeeks.com/2015/08/top-10-useful-yet-paranoid-java-programming-techniques.html
译文: http://www.importnew.com/16805.html

【Java】国外大神总结的 10 个 Java 编程技巧!相关推荐

  1. 通往大神之路,百度Java面试题前200页。

    转载自 通往大神之路,百度Java面试题前200页. 基本概念 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 ...

  2. 国外大神一张图学会python-12306看了会沉默,国外大神利用机器学习15分钟破解网站验证码!...

    原标题:12306看了会沉默,国外大神利用机器学习15分钟破解网站验证码! 相信很多同学,都曾被12306的神级验证码虐到过怀疑人生,但是看了下面这一位国外一位大神的分享,小蓝我算是知道为什么1230 ...

  3. oracle入门到大神(备mysql、java基础、javaee必经之路)-任亮-专题视频课程

    oracle入门到大神(备mysql.java基础.javaee必经之路)-19178人已学习 课程介绍         Oracle10g的安装.orcale的基本概念介绍.命令行常用操作.Scot ...

  4. 【干货】国外大神提高插画设计能力的经验分享

    每个国外设计大神都是我们学习的榜样,哪怕是做插画设计的,对于我们这些品牌平面设计师来做,这些设计思维和经验同样值得我们学习,举一反三,设计都是有共性的.下面的国外大神的经验文章译文. 对我来说,生命中 ...

  5. 国外大神一张图学会python-没有接触过编程Python难学吗?

    从来没有接触过编程的人要入门python,这个真的是明智之举啊. 要知道现在的小学生都在学Python了,所以学习Python编程真的是0门槛啊! 既然是0门槛,所以放弃的人也是最多的,因为人就是这样 ...

  6. 红米4刷linux,极客精神,国外大神将红米Note 7刷上了Ubuntu

    原标题:极客精神,国外大神将红米Note 7刷上了Ubuntu 说起刷机,可能现在许多的科技爱好者都不太经常刷机了,随着现在手机硬件性能的越来越强大,以及系统UI的越来越好用,刷机似乎不再像过去一样成 ...

  7. android 双电池,国外大神拆解腾讯ROG游戏手机5,双电池、中置主板结构、散热用料优秀...

    国外大神拆解腾讯ROG游戏手机5,双电池.中置主板结构.散热用料优秀 2021-03-22 16:33:50 14点赞 23收藏 28评论 上周,我们报道了暴力测试大神JerryRigEverythi ...

  8. android无线充电技术,国外大神发现Android 11隐藏功能:反向无线充电

    中关村在线消息:近日据悉,谷歌正式发布了Android 11开发者预览版,不过国外XDA大神在研究Pxiel 4的Android 11系统时,发现了隐藏的新功能--Battery share. 国外大 ...

  9. android 无线充电节点,国外大神发现 Android 11 隐藏功能:反向无线充电

    中关村在线消息:近日据悉,谷歌正式发布了 Android 11 开发者预览版,不过国外 XDA 大神在研究 Pxiel 4 的 Android 11 系统时,发现了隐藏的新功能-- Battery s ...

最新文章

  1. android studio val,Kotlin学习笔记之const val与val
  2. 将数据追加到html 表格中,将数据添加到数据表中
  3. 关于大数据学习,实战型的书籍
  4. 实现带下拉菜单的工具栏按钮
  5. 如何获得select被选中option的value和text
  6. 选择排序算法流程图_常用排序算法之选择排序
  7. c语言模拟实现库函数strcat,【C语言】模拟实现库函数strcat函数
  8. java用流实现复制功能_【java】IO流 实现简单的复制功能
  9. React入门基础+练习(二)
  10. 联想微型计算机怎么进入bios,详细教你联想电脑怎么进入bios
  11. Jexus 配置ssl
  12. Mysql数据库乱码
  13. svr测试用MATLAB,基于MATLAB的SVR回归模型的设计方案.doc
  14. nodejs下载配置环境下载依赖包
  15. Turbo码编码举例计算
  16. 红米note5系统Android11,红米Note5 MIUI11 解账户锁 可登小米账号 永不反锁 完美ROOT 解锁包...
  17. 链路追踪Logback-MDC介绍
  18. 【正则】常用正则公式
  19. 《PyQt5高级编程实战》学会使用视图委托
  20. WEB工程师和设计师必学的10个IOS 8新鲜改变

热门文章

  1. Redmi K40系统截图曝光:配备顶级2K屏幕+骁龙870移动平台
  2. 苏宁双11战报:0点~1点 线上订单同比增72%
  3. 壕!腾讯85亿买了个岛:200万平方米巨无霸“新鹅厂”来了
  4. 苹果公司首次公布iOS 13和iPadOS 13安装量 都有一颗尝鲜的心
  5. 任正非:5G只是一个工具 本身没有安全问题
  6. 明年,5G iPhone不只一款!
  7. Redmi K20系列上市首月销量破100万台
  8. 12GB超大内存!华为超级旗舰手机悄悄现身
  9. 美国运营商Verizon宣布5月16日开始发售三星5G手机 售价1300美元起
  10. 聊天宝解散,多闪、马桶MT还会远吗?