Company Ghost Story 公司鬼故事 9

contents

  1. 1. Java
    1. 1.1. BufferWriter/StringBuilder
    2. 1.2. BufferWriter/StringBuilder
    3. 1.3. StringBuilder Helper
    4. 1.4. Math Getter/Setter
    5. 1.5. Lookup by Key
    6. 1.6. Default Value by Wrapper Class
    7. 1.7. Constant Value by Wrapper Class

Java

BufferWriter/StringBuilder

1
2
3
4
5
private void writeLong(long v) {
StringBuilder sb = new StringBuilder(8192); // ?
sb.append(Long.toString(v));
writer.write(sb.toString());
}

每一次轉換,別浪費額外的空間 8192 的 StringBuilder。如果真的需要這種 IO 的緩衝區,可以直接宣告在 BufferWriter 給定預設大小的緩衝區。

BufferWriter/StringBuilder

1
2
3
private String writeTwo(String token0, String token1) {
writer.write(token0 + token1); // why not write separately without intermediate result.
}

既然都知道了字串串接會有中間結果,我們可以直接分開寫 writer.write(token0);writer.write(token1); 來達到相同效果。

StringBuilder Helper

1
2
3
4
5
6
7
8
9
10
private static StringBuilder append(StringBuilder sb, String... tokens) {
for (String t : tokens)
sb.append(t);
return sb;
}
append(sb, "a", "b", "c").append("d", "e");
// if performance it critical, please write all statements without sugar syntax
append(ab, "a" + "b", "c");
// ... why?

這種可變參數的寫法會額外產生一個陣列,對於效能來說會很傷。

Math Getter/Setter

1
2
3
4
5
// convert x' = a x + b
private void convert(Point p) {
p.setX(p.getX() * a);
p.setX(p.getX() + b); // why not p.setX(p.getX() * a + b);
}

別中毒於 Java 或者是 OOP 的寫法。

Lookup by Key

1
2
3
4
5
6
7
8
9
10
public T getSelected() {
for (T c : candidates) {
if (Objects.equals(c.toKey(), mSelected))
return c;
}
return null;
}
public void setSelected(T s) {
mSelected = s.toKey(); // why not store `s` directly?
}

在大多數的狀況下都可以直接存原本的物件。除非是在一些特定的序列化,或者是橫跨兩個不同 domain 的交互資料,這時候我們必須採用字串作為中介對象。

Default Value by Wrapper Class

1
2
3
4
5
6
7
8
9
10
11
private Boolean mirror = false; // why use wrapper class here?
public void setMirror(boolean m) {
mirror = m;
}
private void process() {
if (mirror != null) { // why?
// must do here
}
}

多餘的寫法。如果 wrapper class 有預設值,而且還不能被設置 null。那必然有些地方出錯。

Constant Value by Wrapper Class

1
2
3
4
5
private static final Double SIZE = 50L; // ...
public void exec() {
long v = SIZE.longValue(); // ...
}

這傢伙到底在宣告什麼?想用什麼?