Category Archives: Effective Java 第2版

「Effective Java 第2版」 第42回 (7月10日)

Posted on by 0 comment

参加者 青木(読み手), 沼田, 大野, 今井(記)
範囲 p.302 第11章 シリアライズ 項目78 シリアライズされたインスタンスの代わりに、シリアライズ・プロキシを検討する
~ p.305

本日で、「Effective Java 第2版」は終了です。
次回から、「オブジェクト指向入門 第2版 方法論・実践」です。

「Effective Java 第2版」 第41回 (7月7日)

Posted on by 0 comment

参加者 今井(読み手)、青木、大野(記)、沼田

範囲 p.297 ~p.301 第11章 シリアライズ 項目77 インスタンス制御に対しては、readResolveよりenum型を選ぶ

「Effective Java 第2版」 第40回 (7月3日)

Posted on by 0 comment

参加者 今井、青木、大野(読み手)、沼田(記)

範囲 p.291 第11章 シリアライズ 項目76 防御的にreadObjectを書く
~p.297 インスタンス制御に対しては、readResolveよりenum型を選ぶ(readResolveメソッドのコード例まで)

「Effective Java 第2版」 第39回 (6月30日)

Posted on by 0 comment

参加者 沼田(読み手), 今井, 大野, 青木(記)
範囲 p.285 ~ p.290 第11章 シリアライズ 項目75 カスタムシリアライズ形式の使用を検討する

  • 「オブジェクトの物理表現と論理的内容が同じ場合には、デフォルトのシリアライズ形式はおそらく適切です。」について、オブジェクトの物理表現が本当に意味のある値だけから構成される場合には、デフォルトのシリアライズ形式は適切であるということだと解釈した。
  • シリアルバージョンUIDについて、互換性のある変更を行った場合には変更前のクラスのUIDと同じUIDを、互換性のない変更を行った場合は異なるUIDを宣言する。

「Effective Java 第2版」 第38回 (6月26日)

Posted on by 0 comment

参加者 青木(読み手), 沼田, 大野, 今井(記)
範囲 p.278 第10章 並行性 項目73 スレッドグループを避ける
~ p.284 第11章 シリアライズ 項目74 Serializableを注意して実装する

「Effective Java 第2版」 第37回 (6月23日)

Posted on by 0 comment

参加者 今井(読み手)、青木、沼田(記)
範囲 p.269 第10章 並行性 項目70 スレッド安全性を文書化する
~ p.277 項目72 スレッドスケジューラに依存しない

  • p273 インスタンスフィールド遅延初期化の二重チェックイディオム
    volatile宣言したフィールドをそのまま使用せずにローカル変数を用いたほうが性能が改善される可能性があるのは、voatile変数へのアクセスを減らすことができるからではないか。

「Effective Java 第2版」 第36回 (6月19日)

Posted on by 0 comment

参加者 沼田(読み手)、大野(記)
範囲 p.262~268 第10章 並行性 項目68 スレッドよりエグゼキューターとタスクを選ぶ ~ 項目69 waitとnotyfyよりコンカレンシーユーティリティを選ぶ

「Effective Java 第2版」 第35回 (6月16日)

Posted on by 0 comment

参加者今井、青木、 大野(読み手)、沼田(記)
範囲 p.256~261 第10章 並行性 項目67 過剰な同期は避ける

  • p258のExecutorServiceを利用したコード例
    try節でexecutor.submit(…).get();と、submitの後にget()の呼び出しを行っている。
    →submitメソッドから返却されたFutureオブジェクトのget()を呼び出さないと、submitしたタスクが完了するまで待機せずに、メインスレッドでexecutor.shutdown()が実行されてしまうから。

「Effective Java 第2版」 第34回 (6月12日)

Posted on by 0 comment

参加者 沼田(読み手), 今井,  青木(記)
範囲 p.244 第9章 例外 項目62 各メソッドがスローするすべての例外を文書化する
~ p.255 第10章 並行性 項目66 共有された可変データへのアクセスを同期する

  • p.254の
    private static volatile int nextSerialNumber;
    public static int generateSerialNumber(){
      return nextSerialNumber++;
    }
    p.255の
    private static final AtomicLong nextSerialNum = new AtomicLong();
    private static long generateSerialNumber(){
      return nextSerialNum.getAndIncrement();
    }
    は共にインクリメントする前の値を返し、その後インクリメントされる

「Effective Java 第2版」 第33回 (6月5日)

Posted on by 0 comment

参加者 青木(読み手), 沼田, 大野, 今井(記)
範囲 p.236 第9章 例外 項目58 回復可能な状態にはチェックされる例外を、プログラミングエラーには実行時例外を使用する
~ p.243 第9章 例外 項目61 抽象概念に適した例外をスローする

  • 項目59 p.239 のリファクタリングは、単にチェックされない例外を使用するだけではだめなのだろうか? チェックされない例外でもtry catchで捕らえることもできるし、当然p.239中ほどにあるように、単純な呼び出しシーケンスも可能なはず。必要であればJavadocの@throwsに書けば良いし。(メソッドのthrows宣言にも書くことができるけど駄目らしい→項目62)。
    項目57にあるように、上手く設計されたAPIは、通常の制御フローに例外を使用することを、クライアントに強制してはならず、状態検査メソッドを持つべきだというのはわかるけど。