Company Ghost Story 公司鬼故事 6

contents

  1. 1. Java
    1. 1.1. Observer vs. Inheritor
    2. 1.2. WhatIf?
    3. 1.3. Equals vs. ==
    4. 1.4. String.format
    5. 1.5. Mapper Function
    6. 1.6. Comparable
    7. 1.7. Argument vs. Method Name
    8. 1.8. Switch

Java

Observer vs. Inheritor

1
2
3
4
5
6
7
8
9
Tool tool = new Tool() {
@Override
protected void fireSomething(T t) {
super.fireSomething(t);
updateProcess(t);
}
}
void updateProcess(T t) {...}

當觀察者模式 (observer pattern) 的介面應優先考量 attach/addListener,不應該以繼承的方式覆寫 update/fireListener/notify 等函數。

WhatIf?

1
2
3
4
5
if (isA()) {
// something
} else if (isA() && isB()) {
// dead code
}

第二個 else-if 並不會執行到。

Equals vs. ==

1
2
3
if (a == b && a.equals(b)) {...}
if (a == b || a.equals(b)) {...}

對 Java 而言,有 Objects.equals 可以替代呼叫,又或者在 boolean equals(Object) 中包含 == 才對。

String.format

1
String.format("Move %s", fromObj, toObj);

對上參數數量是很重要的。

Mapper Function

1
2
3
4
5
6
7
8
static T a2b(String key) {
Map<String, T> mapper = new HashMap<>();
mapper.put("...", ...);
mapper.put("...", ...);
mapper.put("...", ...);
mapper.put("...", ...);
return mapper.get(key);
}

手動做 if-else 比較快的,建立 hash 可不是這麼簡單,記憶體宣告等因素需要考慮。而它也不屬於只宣告一次的靜態變數,因此並不適合這樣處理。

Comparable

1
2
3
4
5
@Override
int compareTo(T other) {
int[] c = {fa.compareTo(other.fa), fb.compareTo(other.fb) ...};
return firstNotZero(c);
}

if-else 不應該這樣被偷懶的,整個效能都爛了。

Argument vs. Method Name

1
2
3
4
5
void doExpand(boolean isExpand) {
if (!isExpand)
doCollapse();
...
}

好的命名決定品質。

Switch

1
2
3
4
5
6
7
8
static void enableAListener() {}
static void removeAListener() {}
static void addBListener() {}
static void stopBListener() {}
static void setCListener() {}
static void disableCListener() {
sListeners.remove(sAListener);
}

有一種被玩弄的感覺 …