今更ながら"Java Puzzlers"を読み始めた

Java™ Puzzlers: Traps, Pitfalls, and Corner Cases

Java™ Puzzlers: Traps, Pitfalls, and Corner Cases

以前から名著だと言われていた"Java Puzzlers"を読んでみたかったのだが、絶版になっていることを知り落胆。しかし、Kindle版が出ていることをJJUGで教えてもらったので嬉々として読み始めることにしました。(Kindle版なので英語ですが、iPhoneKindleアプリはその場で英単語を調べられるので通勤時間でサクサク読めます! )

内容はお遊びな感じだろうと思っていたが、j5ik2oさんも書いてるように"Effective Java"に書いてあるような内容に関する問題があったり、Javaの詳細な言語仕様を知れたりしてかなり面白い。

クリーンなコードに修正するための問題もあったりするので、Java中級者であれば一度読んでみることをお勧めします。

問題

さて、ここで"Java Puzzlers"から出題。 問題は"No.56 Big Problem"から。

以下のプログラムはなんと出力されるでしょうか?

public class BigProblem{
  public static void main(String[] args){
    BigInteger fiveThousand = new BigInteger("5000");
    BigInteger fiftyThousand = new BigInteger("50000");
    BigInteger total = BigInteger.ZERO;

    total.add(fiveThousand);
    total.add(fiftyThousand);
    System.out.println(total);
  }
}

正解は、"55000"... ではなく、"0"です。

なぜかというと、ご存じの方も多いかと思いますがBigIntegerはImmutableなクラスであり、BigInteger#addは返り値として加算結果を返すからです。 しかし、このメソッド名はCollectionパッケージのMutalbeなList#add等を連想させるため、良い名前とは言えません。 Java Puzzlersではこのメソッドに相応しい名前の候補として"plus"を挙げています。 こうすると、

total  = total.plus(fiveThousand);

となり、a = a + b のように英文的にも自然な文法として読めるため、綺麗なコードになると思います。

この辺りは流行りのリーダブルコートなどの"名前重要"でも言われている事ですが、Java APIでも意外と微妙なインタフェースのClassがあるものですね。

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)

リーダブルコード ―より良いコードを書くためのシンプルで実践的なテクニック (Theory in practice)