这是一个国外大神20多年的经验总结出来的……
“任何或许犯错的工作,最终都会犯错。”
这便是人们为什么喜爱进行“防错性程序设计”的原因。偏执的习气有时很有含义,有时则不行明晰也不行聪明,或许当你想到这样写的人的时分还会觉得有点古怪。下面是我列出的的个人感觉最有用而又偏执的 10 项 Java 编程技巧。请看:
1. 把字符串常量放在前面
经过把字符串常量放在比较函数equals()比较项的左面来防止偶尔的 NullPointerExcepTIon 历来都不是一个坏主意,就像这样:
这是毫无疑问的,把一种表达式转换成另一种更好的表达式,并不会失掉什么。只需咱们的OpTIons是实在存在的(Java 8中 OpTIonal是对能够为空的目标进行的封装),不是吗?评论一下…
2. 不要信任前期的JDK APIs
Java刚呈现的时分,编程一定是件很苦楚的事。那时的API依然不行老练,你或许从前遇到过这样一段代码:
看起来很古怪对吗?或许吧,可是看看这个Javadoc:
“假如笼统路径名表明的不是一个目录,那么这个办法回来null。不然回来一个字符串数组,其间每个字符串表明当时目录下的一个文件或目录。”
是的,最好再加上判空查看,以保证正确:
糟糕!前者违反了 Java 编码中 10 个奇妙的最佳实践的规矩#5和#6。因而一定要记住判 null查看!
3. 不要信任“-1”
我知道这很偏执,Javadoc中关于 String.indexOf() 的前期描绘是这样的:
“字符在字符序列中第一次呈现的方位将作为成果[被回来],假如字符不存在则回来-1。”
所以,-1 就能够天经地义被拿来用,对吗?我说不对,看看这个:
谁知道呢。或许在某个特定场合下他们将会需求另一种 编码值,假如不区别大小写的话,otherString 就会被包括进去…此刻或许能够回来 -2呢?谁知道呢。
究竟,咱们有十分多关于NULL——价值亿万美金的过错的评论。为什么不开端评论 -1呢,某种含义上来说 -1 是 null 在int类型下的另一种方式。
4. 防止意外的赋值
是的。即便最优异的程序员也或许犯这种过错(当然,不包括我。看#7)。
(假定这是JavaScript,咱们暂时偏执地以为是这种言语)
再说一遍。假如你的表达式中有常量,将它放在等式左面。这样当你计划再增加一个 = 时,不容易犯错。
5. 查看null和长度
不管什么时分你有一个调集、数组或许其他的,保证它存在而且不为空。
你不知道这些数组来自哪儿,或许是前期的JDK API呢?
6. 全部的办法都用 final 声明
你能够告知我任何你想要的开闭准则,不过那都是胡言乱语。我不信任你(能够正确承继我的类),也不信任我自己(不会意外地承继我的类)。因而除了接口(专门用于承继)都应该是严厉的 final。
是的,写成final。假如这样做对你来说没有含义,你也能够经过批改或重写字节码来改动类和办法,或许发送功用恳求。作为Java技能栈大众号小编,我敢肯定的告知你重写类/办法并不是一个好主意。
7. 全部的变量和参数都用 final 声明
就像我说的。我不信任自己不会无意间重写了某个值。这么说来,我确实一点都不信任自己。由于:
这也是为什么全部的变量和参数都用final声明的原因。
好吧,我供认,这一条我自己也不常用,尽管我应该用。我期望Java能像Scala言语相同,人们在全部当地都直接用 val 来表明变量,乃至都不考虑易变性,除非清晰需求的时分他们才用 var 来声明变量,可是这样的时机特别少。
8. 重载的时分不要信任泛型
是的,这是会产生的。你觉得你写了一个超好的API,它真的是既酷炫又直观;接着就呈现了一群用户,他们仅仅把全部类型生搬硬套进 Object 中 直到那该死的编译器停止工作,然后他们忽然链接到了过错的办法,以为这全部都是你的错(工作总是这样)。
考虑一下这个:
由于,你知道的…你的用户们,他们就像这样
信任我,我看过的多了,还有这样的
所以说偏执是有优点的。
9. 总是在switch句子里加上default
Switch…作为最诙谐的表达式之一,我不知道是该心存敬畏仍是静静哭泣。不管怎样,咱们已然无法脱节 switch ,在必要的时分咱们最好能够正确使用它,例如:
由于在当 value=3 被引进到软件中的时分,default 就能发挥效果,使其正常运转!别和我提 enum 类型,由于这对 enums 也相同适用。
10. 用大括号离隔 switch 的每一个 case 块
事实上,switch是最坑爹的句子,任何喝醉了或是赌输了的人都能够在某种言语中使用它。看看下面这个比如:
在switch句子中,为全部的case都只界说了一个效果域。事实上,这些case不是真实含义上的句子,他们更像是标签,而switch便是指向这些标签的goto句子。事实上,你乃至能够把case句子和 惊人的FORTRAN77项声明 类比,关于FORTRAN,它的奥秘现已逾越了它的功用。
这意味着变量final int j 能够被任何case拜访,不管咱们是否有break。看起来并不是很直观。咱们能够经过增加简略的花括号为每一个case创立一个新的嵌套的效果域,当然不要忘了在每个 case 的句子块最终加 break。
定论
编程时的强迫症有时分看起来会很古怪,会使得代码往往比必需的还要冗长。你或许会想,“啊,这种状况永久不会产生!”,可是正如我所说的,在阅历了20年左右的编程生计后,你不会想要再去批改那些仅仅由于编程言语的陈旧和固有缺点而导致的愚笨而不必要的bug了。由于你知道…。.