Company Ghost Story 公司鬼故事 7

contents

  1. 1. Java
    1. 1.1. try-catch-exception
    2. 1.2. Double Brace Initialization
    3. 1.3. No More Inheritance

Java

try-catch-exception

1
2
3
4
5
6
7
8
9
10
11
Object getSomething() {
final Exception abort = new RuntimeException();
try {
// ...
} catch (Exception e) {
if (e == abort)
// fine
else
e.printStackTrace();
}
}

每次呼叫這個函數都要先建立一個例外,然後看裡面會不會丟出來,這個其實很浪費空間和時間建立。可以考慮建立一個特殊 AbortException 來取代預先建立的例外,或者建立一個全局的靜態例外物件來使用。

Double Brace Initialization

1
2
3
4
5
6
7
8
9
10
11
12
final Set<String> set = new HashSet<> {
{
add("A");
add("B");
add("C");
} // no more
};
// why not?
set.add("A");
set.add("B");
set.add("C");

這會額外建立匿名類別。如果宣告在一般的成員方法中,還會捕抓成員變數,造成內存洩漏而無法回收的狀況。

No More Inheritance

1
2
3
4
5
6
7
8
9
10
11
12
13
class Point extends Pair<Integer, Integer> {
Point(int x, int y) {
super(x, y);
}
@Override
public boolean equals(Object o) {
if (o instanceof Point) {
Point p = (Point) o;
return first == p.first && second == p.second; // wrong
}
return false;
}
}

別忘了,Java 中的 wrapper class 可是一個物件,光靠 == 是不能比較相同與否。雖然對於數值小於某個定值的時候,他們會在常數內存池中取得,讓你覺得一切都好像沒事。