java编程习惯

来源:互联网 发布:popcorn time mac 编辑:程序博客网 时间:2024/06/05 13:23


1.将String字符串放在最前面

为了防止偶发性的NullPointerException 异常,我们通常将String放置在equals()函数的左边来实现字符串比较,如下代码:

Java代码
  1. // Bad  
  2. if (variable.equals("literal")) { ... }  
  3. // Good  
  4. if ("literal".equals(variable)) { ... }  

这是随便用脑子想想就可以做的事,从Bad版本的代码改写表达式到Good版本的代码,这中间并不会丢失任何东西。欢迎不同的观点…

2.不要相信早期的JDK API

在Java早期,编程是一件非常痛苦的事情。那些API仍然很不成熟,也许你已经碰到过下面的代码块:
Java代码
  1. String[] files = file.list();  
  2. // Watch out  
  3. if (files != null) {  
  4.     for (int i = 0; i < files.length; i++) {  
  5.         ...  
  6.     }  
  7. }  

看上去很偏执?也许吧,但请看Javadoc:

如果这个虚拟路径不表示一个文件夹目录,则此方法返回null。否则将会返回一个字符串数组,每一个字符串表示目录中的文件或文件夹。

对,没错。我们可以添加一些校验:
Java代码
  1. if (file.isDirectory()) {  
  2.     String[] files = file.list();  
  3.     // Watch out  
  4.     if (files != null) {  
  5.         for (int i = 0; i < files.length; i++) {  
  6.             ...  
  7.         }  
  8.     }  
  9. }  

3.不要相信“-1”

我知道这是偏执的,但Javadoc中对 String.indexOf()方法明确指出:对象内第一次出现指定字符的位置索引,如果为-1则表示该字符不在字符序列中。

所以使用-1是理所当然的,对吗?我说不对,请看以下代码:
Java代码
  1. // Bad  
  2. if (string.indexOf(character) != -1) { ... }  
  3. // Good  
  4. if (string.indexOf(character) >= 0) { ... }  

谁知道呢。也许到时候他们改变了编码方式,对字符串并不区分大小写,也许更好的方式是返回-2?谁知道呢。

4.避免意外赋值

是的。这种事情也许经常会发生。
Java代码
  1. // Ooops  
  2. if (variable = 5) { ... }  
  3. // Better (because causes an error)  
  4. if (5 = variable) { ... }  
  5. // Intent (remember. Paranoid JavaScript: ===)  
  6. if (5 === variable) { ... }  

所以你可以将比较常量放置在左侧,这样就不会发生意外赋值的错误了。

5.检查Null和Length

无论如何,只要你有一个集合、数组等,请确保它存在,并且不为空。
Java代码
  1. // Bad  
  2. if (array.length > 0) { ... }  
  3. // Good  
  4. if (array != null && array.length > 0) { ... }  

你并不知道这些数组从哪里来,也许是来自早期版本的JDK API,谁知道呢。

6.所有的方法都是final的

你也许会告诉我你的开/闭原则,但这都是胡说八道。我不相信你(正确继承我这个父类的所有子类),我也不相信我自己(不小心继承我这个父类的所有子类)。所以对于那些意义明确的方法要严格用final标识。
Java代码
  1. / Bad  
  2. public void boom() { ... }  
  3. // Good. Don't touch.  
  4. public final void dontTouch() { ... }  


7.所有变量和参数都是final

就像我说的。我不相信我自己(不要意外覆盖我的值)。话虽如此,我不相信我自己的是因为…



…这就是为什么所有的变量和参数都是final的原因。
Java代码
  1. // Bad  
  2. void input(String importantMessage) {  
  3.     String answer = "...";  
  4.     answer = importantMessage = "LOL accident";  
  5. }  
  6. // Good  
  7. final void input(final String importantMessage) {  
  8.     final String answer = "...";  
  9. }  

8.重载时不要相信泛型

是,它可以发生。你相信你写的超级好看的API,它很直观,随之而来的,一些用户谁只是将原始类型转换成Object类型,直到那该死的编译器停止发牢骚,并且突然他们会链接错误的方法,以为这是你的错误。

看下面的代码:
Java代码
  1. // Bad  
  2. <T> void bad(T value) {  
  3.     bad(Collections.singletonList(value));  
  4. }  
  5. <T> void bad(List<T> values) {  
  6.     ...  
  7. }  
  8. // Good  
  9. final <T> void good(final T value) {  
  10.     if (value instanceof List)  
  11.         good((List<?>) value);  
  12.     else  
  13.         good(Collections.singletonList(value));  
  14. }  
  15. final <T> void good(final List<T> values) {  
  16.     ...  
  17. }  

因为,你知道……你的用户,他们就像
Java代码
  1. // This library sucks  
  2. @SuppressWarnings("all")  
  3. Object t = (Object) (List) Arrays.asList("abc");  
  4. bad(t);  

相信我。这一切我都看到过。包括下面的



这种偏执还是不错的。

9.总是在Switch语句的Default中抛出异常

Switch语句……它们其中一个可笑的语句我不知道该对它敬畏还是哭泣,但无论如何,既然我们坚持用switch,那我们不妨将它用得完美,看下面的代码:
Java代码
  1. // Bad  
  2. switch (value) {  
  3.     case 1: foo(); break;  
  4.     case 2: bar(); break;  
  5. }  
  6. // Good  
  7. switch (value) {  
  8.     case 1: foo(); break;  
  9.     case 2: bar(); break;  
  10.     default:  
  11.         throw new ThreadDeath("That'll teach them");  
  12. }  

当value == 3时,将会出现无法找到的提示,而不会让人不知所谓。

10.Switch语句带花括号

事实上,switch是最邪恶的语句,像是一些喝醉了或者赌输了的人在写代码一样,看下面的例子:
Java代码
  1. // Bad, doesn't compile  
  2. switch (value) {  
  3.     case 1int j = 1break;  
  4.     case 2int j = 2break;  
  5. }  
  6. // Good  
  7. switch (value) {  
  8.     case 1: {  
  9.         final int j = 1;  
  10.         break;  
  11.     }  
  12.     case 2: {  
  13.         final int j = 2;  
  14.         break;  
  15.     }  
  16.     // Remember:  
  17.     default:   
  18.         throw new ThreadDeath("That'll teach them");  
  19. }  

在switch语句中,每一个case语句的范围只有一行语句,事实上,这些case语句甚至不是真正的语句,他们就像goto语句中的跳转标记一样。
这些习惯看起来不是很有说服力,但是可以让你避免很多的异常错误;

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 躺平了 腿酸痛怎么办 500上下蹲后腿痛怎么办 蹲完马步后站不起来怎么办? 车在水里熄火了怎么办 脚磕到了很疼怎么办 破腹产4年了腰疼怎么办 蹲起之后腿疼怎么办 深蹲起跳伤腰部怎么办 蹲起膝盖有响声怎么办 腰突然不能弯了怎么办 蚂蚱吃了会过敏怎么办 孕妇能吃蚂蚱菜怎么办 孕妇吃了蚂蚁菜怎么办 白果很硬的时候怎么办 有痔疮吃了胡椒怎么办 吃紫菜多了难受怎么办 四川泡菜太酸了怎么办 孕妇吃了白花菜怎么办 怀孕吃了马扎菜怎么办 被铁钉扎伤了脚怎么办 风扇吹得肩膀疼怎么办 胳膊肌肉那块肿了怎么办 生完孩子臀部变宽怎么办 3岁宝宝肋骨外翻怎么办 胸肌正面不明显侧面看才有怎么办 小孩胸肌骨突出外翻怎么办 衣柜隔层板坏了怎么办 科三路线记不住怎么办 喂奶以后胸变小了怎么办 健身完肩膀缝疼怎么办 生过孩子胯部宽怎么办 无肩带文胸往下滑怎么办 内衣肩带老是往下滑怎么办 乳房发育一边大一边小怎么办 母猫乳房有硬块怎么办 19岁乳晕很大乳头很小怎么办 做完俯卧撑胳膊特别痛怎么办 电压低风扇转不动怎么办 小孩不配合康复锻炼怎么办 跑步机安全开关脱落怎么办 办健身卡贵了怎么办