这里列出10条JAVA编程经验
1 字符串常量放在前面
把字符串常量放在equals()比较项的左侧来防止偶然的NullPointerException。
// Bad if (variable.equals("literal")) { ... } // Good if ("literal".equals(variable)) { ... }
2 不要相信-1
// Bad if (string.indexOf(character) != -1) { ... } // Good if (string.indexOf(character) >= 0) { ... }
3 避免意外的赋值
如果你的表达式中有常量,将它放在等式左边。这样当你打算再添加一个 = 时,不容易出错。
// Ooops if (variable = 5) { ... } // Better (because causes an error) if (5 = variable) { ... } // Intent (remember. Paranoid JavaScript: ===) if (5 === variable) { ... }
4 检查NULL和长度
不管什么时候你有一个集合、数组或者其他的,确保它存在并且不为空
// Bad if (array.length > 0) { ... } // Good if (array != null && array.length > 0) { ... }
当然也可以用Collections.isEmpty() 判断
5 所有的方法都用final声明
你可以告诉我任何你想要的开闭原则,不过那都是胡说八道。我不相信你(可以正确继承我的类),也不相信我自己(不会意外地继承我的类)。因此除了接口(专门用于继承)都应该是严格的 final
// Bad public void boom() { ... } // Good. Don't touch. public final void dontTouch() { ... }
6 所有的变量和参数都用final声明
// Bad void input(String importantMessage) { String answer = "..."; answer = importantMessage = "LOL accident"; } // Good final void input(final String importantMessage) { final String answer = "..."; }
7 重载的时候不要相信泛型
// Bad <T> void bad(T value) { bad(Collections.singletonList(value)); } <T> void bad(List<T> values) { ... } // Good final <T> void good(final T value) { if (value instanceof List) good((List<?>) value); else good(Collections.singletonList(value)); } final <T> void good(final List<T> values) { ... }
8 总是在switch语句里加上default
// Bad switch (value) { case 1: foo(); break; case 2: bar(); break; } // Good switch (value) { case 1: foo(); break; case 2: bar(); break; default: throw new ThreadDeath("That'll teach them"); }
9 用大括号隔开switch的每一个case块
// Bad, doesn't compile switch (value) { case 1: int j = 1; break; case 2: int j = 2; break; // j重复定义 } // Good switch (value) { case 1: { final int j = 1; break; } case 2: { final int j = 2; break; } // Remember: default: throw new ThreadDeath("That'll teach them"); }