推行 热搜:

这10条不得不提的Java编程本领让你受害终生!

   日期:2017-11-21     阅读:622    批评:0    
中心提示:好的习气是乐成的一半。由于,你晓得,“任何能够堕落的事变,最初都市堕落。”这便是人们为什么喜好停止“防错性顺序设计”的原
好的习气是乐成的一半。由于,你晓得,“任何能够堕落的事变,最初都市堕落。”这便是人们为什么喜好停止“防错性顺序设计”的缘由。上面我列出的的团体觉得最有效而又偏执的 10 项 Java 编程本领。请看:

1. 把字符串常量放在后面(技能文)
经过把字符串常量放在比拟函数equals()比拟项的左侧来避免偶尔的 NullPointerException 历来都不是一个坏主见,就像如许:
// Bad
if (variable.equals("literal")) { ... }
// Good
if ("literal".equals(variable)) { ... }
这是毫无疑问的,把一种表达式转换成另一种更好的表达式,并不会得到什么。只需我们的Options是真实存在的(Java 8中 Optional是对可以为空的工具停止的封装),不是吗?讨论一下…
2. 不要置信晚期的JDK APIs
Java刚呈现的时分,编程肯定是件很苦楚的事。当时的API依然不敷成熟,你能够已经遇到过如许一段代码:
String[] files = file.list();
// Watch out
if (files != null) {
for (int i = 0; i < files.length; i++) {
...
}
}
看起来很奇异对吗?大概吧,但是看看这个Javadoc:
“假如笼统途径名表现的不是一个目次,那么这个办法前往null。不然前往一个字符串数组,此中每个字符串表现以后目次下的一个文件或目次。”
是的,最好再加上判空反省,以确保准确:
if (file.isDirectory()) {
String[] files = file.list();
// Watch out
if (files != null) {
for (int i = 0; i < files.length; i++) {
...
}
}
}
蹩脚!因而肯定要记得判 null反省!
3. 不要置信“-1”(技能文)
我晓得这很偏执,Javadoc中关于 String.indexOf() 的晚期描绘是如许的…
“字符在字符序列中第一次呈现的地位将作为后果[被前往],假如字符不存在则前往-1。”
以是,-1 就可以天经地义被拿来用,对吗?我说不合错误,看看这个:
// Bad
if (string.indexOf(character) != -1) { ... }
// Good
if (string.indexOf(character) >= 0) { ... }
谁晓得呢。大概在某个特定场所下他们将会需求另一种 编码值,假如不区分巨细写的话,otherString 就会被包括出来…此时大概可以前往 -2呢?谁晓得呢。
终究,我们有十分多关于NULL——代价亿万美金的错误 (https://blog.jooq.org/2015/07/22/null-is-not-the-billion-dollar-mistake-a-counter-rant/)的讨论。为什么不开端讨论 -1呢,某种意义下去说 -1 是 null 在int范例下的另一种方式。
4. 防止不测的赋值(技能文)
是的。即便最良好的顺序员也能够犯这种错误(固然,不包罗我。看#7)。
(假定这是Javascript,我们临时偏执地以为是这种言语)
// Ooops
if (variable = 5) { ... }
// Better (because causes an error)
if (5 = variable) { ... }
// Intent (remember. Paranoid Javascript: ===)
if (5 === variable) { ... }
再说一遍。假如你的表达式中有常量,将它放在等式右边。如许当你计划再添加一个 = 时,不容易堕落。
5. 反省null和长度
不论什么时分你有一个聚集、数组或许其他的,确保它存在而且不为空。
// Bad
if (array.length > 0) { ... }
// Good
if (array != null && array.length > 0) { ... }
你不晓得这些数组来自哪儿,大概是晚期的JDK API呢?
6. 一切的办法都用 final 声明(技能文)
你可以通知我任何你想要的开闭准绳,不外那都是胡言乱语。我不置信你(可以准确承继我的类),也不置信我本人(不会心外地承继我的类)。因而除了接口(专门用于承继)都应该是严厉的 final。可以检查我们的 Java 编码中 10 个奇妙的最佳理论 中的#9。
// Bad
public void boom() { ... }
// Good. Don't touch.
public final void dontTouch() { ... }
是的,写成final。假如如许做对你来说没故意义,你也可以经过修正或重写字节码来改动类和办法,或许发送功用恳求。我敢一定重写类/办法并不是一个好主见。
7. 重载的时分不要置信泛型(技能文)
是的,这是会发作的。你以为你写了一个超好的API,它真的是既酷炫又直观;接着就呈现了一群用户,他们只是把统统范例生搬硬套进 Object 中 直到那活该的编译器中止任务,然后他们忽然链接到了错误的办法,以为这统统都是你的错(事变总是如许)。
考虑一下这个:
// 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) {
...
}
由于,你晓得的…你的用户们,他们就像如许
// This library sucks
@SuppressWarnings("all")
Object t = (Object) (List) Arrays.asList("abc");
bad(t);
置信我,我看过的多了,另有如许的
顺序员看过去!这10条不得不提的java编程本领让你受害终生!
以是说偏执是有益处的。
8. 总是在switch语句里加上default(好技能文)
Switch…作为最诙谐的表达式之一,我不晓得是该心存敬畏照旧冷静哭泣。不论怎样,我们既然无法解脱 switch ,在须要的时分我们最好可以准确运用它,比方:
// 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");
}
由于在当 value=3 被引入到软件中的时分,default 就能发扬作用,使其正常运转!别和我提 enum 范例,由于这对 enums 也一样实用。
9. 用大括号离隔 switch 的每一个 case 块(技能文)
现实上,switch是最坑爹的语句,任何喝醉了或是赌输了的人都可以在某种言语中运用它。看看上面这个例子:
// Bad, doesn't compile
switch (value) {
case 1: int j = 1; break;
case 2: int j = 2; break;
}
// 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");
}
在switch语句中,为一切的case都只界说了一个作用域。现实上,这些case不是真正意义上的语句,他们更像是标签,而switch便是指向这些标签的goto语句。现实上,你乃至可以把case语句和 惊人的FORTRAN77项声明 类比,关于FORTRAN,它的奥秘曾经逾越了它的功用。
这意味着变量final int j 可以被任何case拜访,不管我们能否有break。看起来并不是很直观。我们可以经过添加复杂的花括号为每一个case创立一个新的嵌套的作用域,固然不要忘了在每个 case 的语句块最初加 break。
 
打赏
 
更多>同类资讯
0相干批评

引荐图文
引荐资讯
点击排行
网站首页  |  关于我们  |  联络方法  |  运用协议  |  版权隐私  |  网站舆图  |  排名推行  |  告白效劳  |  网站留言  |  RSS订阅  |  违规告发  |  鄂ICP备14001892号-2