[Java]剑走偏锋的10条编程技巧


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




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

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

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

  1. // Bad  
  2. if (variable.equals(“literal”)) { … }  
  3.    
  4. // Good  
  5. if (“literal”.equals(variable)) { … }  


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

2.不要相信早期的JDK APIs 

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

  1. String[] files = file.list();  
  2.    
  3. // Watch out  
  4. if (files != null) {  
  5.     for (int i = 0; i < files.length; i++) {  
  6.         …  
  7.     }  
  8. }  


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

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

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

  1. if (file.isDirectory()) {  
  2.     String[] files = file.list();  
  3.    
  4.     // Watch out  
  5.     if (files != null) {  
  6.         for (int i = 0; i < files.length; i++) {  
  7.             …  
  8.         }  
  9.     }  
  10. }  


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

3. 不要相信“-1” 

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

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

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

  1. // Bad  
  2. if (string.indexOf(character) != –1) { … }  
  3.    
  4. // Good  
  5. if (string.indexOf(character) >= 0) { … }  


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

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

4.避免意外的赋值 

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

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

  1. // Ooops  
  2. if (variable = 5) { … }  
  3.    
  4. // Better (because causes an error)  
  5. if (5 = variable) { … }  
  6.    
  7. // Intent (remember. Paranoid JavaScript: ===)  
  8. if (5 === variable) { … }  


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

5.检查null和长度 

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

  1. // Bad  
  2. if (array.length > 0) { … }  
  3.    
  4. // Good  
  5. if (array != null && array.length > 0) { … }  


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

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

你可以告诉我任何你想要的开闭原则,不过那都是胡说八道。我不相信你(可以正确继承我的类),也不相信我自己(不会意外地继承我的类)。因此除了接口(专门用于继承)都应该是严格的 final。可以查看我们的Java编码中10个微妙的最佳实践中的#9。&nbsp

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2015年9月16日
下一篇 2015年9月16日

相关推荐