読書会(Effective Javaプログラミング言語ガイド)第1回議事録

[ 戻る ]


Effective Java 第 1 回議事録

日時:2002/5/25 10:00-16:45
場所:三田図書館 3F集会室B
参加者:鈴木さん、根本さん、天野さん、福嶋さん、佐藤さん、山本さん、門脇さん、
        荒井さん、金井さん、村山さん、河野さん、伊藤さん、小滝さん、下東さん、
        中村さん、石黒さん、高橋(徹)さん、高橋(智)
朗読者:山本さん、金井さん
書記:高橋(智)

◆はじめに
    今回から、2002年のJolt賞を獲得した話題の書を読みはじめました。
    参加者の方も18名にもおよび大変賑やかな読書会となりました。内容が
  濃いためになかなか読み進められませんでした。あと5,6回は開催すると
  思います。


■ まえがき

P XI
  デザインパターンの本の表紙には「ロゼッタストーン」の絵が書かれているが
    --> ロゼッタストーン て何?
        --> 文字も解読に使われた。
    --> 学校で習ったような記憶がある

P XII
    Doug Lea 氏の名前が登場するが、以前、SunのWebサイトにてDoug Lea 氏と
  ライブでチャットできたそうです。Doug Lea 氏の著書についての質問とかも
  できたようです。
    また、JSR166 にて Concurrency Utilities という規格が提案されているそ
  うです。
    http://gee.cs.oswego.edu/dl/concurrency-interest/jsr166-28jan02-4up.pdf

P1
  本書を読み進めるためには後の章を読まなければ、意味が分からない時がある
    --> 必要に応じて適時参照してください


■ 項目1(コンストラクタの代わりにstaticファクトリメソッドの提供を検討する)
P5
  Boolean型はJDK1.3までは、常にnewで生成する必要があったのか?
    --> そのようだ
  
  BigInteger.probablePrime()メソッドを使う時はどのような時だろうか?
    --> 素数が欲しい時
    --> probable(おそらく)の意図する所は何であろうか?
    --> APIのdocumentを読む必要がありそうだ

P6
  「不変クラス」については13項目を参照する必要がある
     --> コンストラクタとgetterはあるが、setterがないものと言える
         --> java.lang.String がその例である

  ==演算子は、シリアライズや分散環境と非常に関係が深い
    --> 注意する必要あり
    --> readResolveメソッドの存在

  ==演算子について書かれているが、==演算子の使用を勧めているのか?
    --> java.lang.String の処理が重いので、==演算子を使う価値あり
    --> プロファイラツールのOptimizeitを使って、ボトルネックがString
        の処理である事を発見したことがあった。

  String.internメソッドの意味・価値は何なのか?
    --> システムのコンスタントプールに文字列を登録する
    --> 重い処理(メソッド)だが、後の文字列比較の時に非常にラクになる
        --> ただし、使う時には注意が必要
    --> パーザを作るときには internを使う価値がありそうだ
    --> 参加者の皆さんはinternを使った経験はとても少ないようだ

P7
  「概念的重みが軽くなっている」とは?
    --> publicクラスの量が減って、ユーザーの知る必要のあるAPIが少ないと
        言うこと。実装クラスや、実装コードの量が減っているわけではない

  staticファクトリメソッドは、JDBCやJAXPでも使われている
    --> C++でも「staticファクトリメソッド」は実現出来るのか?
        --> できない、もしくは、とても難しい
        --> C++には動的クラスロードがあるのか?

P9
  「まず最初にstaticファクトリメソッドを検討しろ」と言っているが?
    --> 実践するのは難しい!!
    --> プーリング処理には効果を発揮する

  CalendarクラスのgetInstanceメソッドの意味は?
    --> 暦には種類がたくさんあるから、各種ルールに応じてインスタンスを
        生成するためにある
        --> 大安や仏滅を処理できるCalendarはあるのか?
            --> Calendarはそこまでは考慮していない


■ 項目2(privateのコンストラクタでシングルトン特性を強制する)

P11
  「Elvisの偽者」は一体何処にいるのか?
    --> デシリアライズの実装の中にいる
        --> readResolveメソッドはその実装の中から呼ばれる
            --> 各自探してみる

  readResolveメソッドは、以前、JDCのメールマガジンとして送られてきたTips
  に詳しく書かれていた。
    --> Sunのサイトにバックナンバーがある
    --> JDCのニュースレターは、色々種類があって、購読したいものを選択できる

  そもそも、Singletonオブジェクトをネットワーク越しに送ることなどあるのか?
    --> ==演算子に深く関係する問題だ
        --> ==では比較できないことが発生することがある
    --> ほとんどあり得ない場面(処理)である
    --> Singletonが提供する機能を、EJB,CORBA,WebServiceなどのサービスとして
        提供するのはどうか?

  第10章には、Serializableについての詳しい解説や例が載っている


■ 項目3(privateのコンストラクタでインスタンス化不可能を強制する)

   特に話題はなし


◆ 昼食
   近くの中華料理屋。16人も座れるテーブルが無いため、二つのテーブルに別れて
 楽しいひととき。
   沖縄から出張で東京に来られている方や、東京に上京してこられた方など、初め
 てお会いするかたばかりで、とても新鮮でした。


■ 項目4(重複したオブジェクトを生成するのを避ける)

P13
  public String(String str) というコンストラクタを使っている例を良く見かける

  public String(String str) のコンストラクタがあるのは何故だろう?
    --> 明示的にインスタンスを分けたい場合に使うのではないか
    --> 文字コード変換に使えるのではないか

  JavaプログラマがC++のコードを書くと、インスタンスの生成を忘れてしまいがち
    --> ポインタ渡しや参照渡しを正しく使い分ける必要もある

P14
  isBabyBoomerメソッドはもっと高速にすることもできる
    --> コンストラクタのなかで判定してしまう

P15
  lazy initialization は、Javaの格言でも取り上げられていた
    --> Javaの格言では「怠惰な」という訳になっていた

P16
  「防御的コピー」とは?
    --> 簡単に言うと、DeppCopyのこと
    --> 項目24ではコンストラクタを使ってDataのインスタンスを生成している
        --> Dataクラスは可変であるため
            --> 変更するメソッドがあるということか?
                --> 全部deprecateなメソッドだが、変更するメソッドがある

  自分で作ったメソッドを deprecate 指定すると、コンパイル時に本当に警告が
  出るのだろうか?
    --> 出ないことがあったらしい
        --> 確証がないので、試してみる!!

  getter/setterメソッドを使うと、publicなfieldに比べてパフォーマンスは悪い
  のか?
    --> Hotspotならほとんど変わらない


■ 項目5(廃れたオブジェクト参照を取り除く)

P18
  網掛けの部分のコードは本当に必要なのか?
    --> あまり見かけないように思える...

P19
  2行目,3行目の内容は注意する必要あり!!

  JProbeの機能にはメモリーリークを検出するものがあるようだ

  「保守的なGC」というのがある
    --> 組み込み系のVMには使われていることもあるらしい
        --> 情報求む!!

  log4Jというログ出力ライブラリがあって、とても強力で使い易いそうです


■ 項目6(ファイナライザを避ける)

P21
  「ファイナライザのなかで発生した例外は無視される」とは?
    --> GCスレッドが無視するということ

  JDBCのConnectionやグラフィックスを使う場合は、明示的な終了メソッドを
  呼び出す典型的な場合である

P22
  「ネイティブピア」とは?
    --> ネイティブなリソースのこと

  「エンクロージングクラス」「エンクロージングインスタンス」とは?
    --> 意味は?
    --> 日本語の訳語は?
    --> なんとなく感じはわかるのだが...

  インナークラスを持っているアウタークラスの終了の仕方について
    --> 親のファイナライザと、子のファイナライザが呼び出される順番は?
        --> 試してみる!!
    --> 各ファイナライザが混乱しないように、flagやtry/catchを使って注意
        する必要あり

  Singletonクラスの中に、ファイナライザを書くことによって、Singletonクラスの
  ガベージコレクションが防げるのではないか?
    --> 実験してみる価値あり!!


■ 項目7(equalsをオーバーライドする時には一般契約に従う)

P32
  instanceofではなく、クラスキャストを使うというのはどうか?
    --> nullは何にでもキャストできるので、ダメ

P34
  java.net.URLクラスのequalsメソッドの実装はどうなっているの?
    --> ネットワークに繋がっていないマシンの場合にはどうなる?
    --> URLのソースを覗いてみる必要あり
    --> よく ~ を %7E と表現しているURLがあるが、この場合にはどのように比較
        されるのだろうか?`

  ==演算子とequalsメソッドの関係については注意する必要あり

  XSLTの同値比較はとてもややこしいらしい
    --> 情報求む!!


■ 項目8(equalsをオーバーライドする時は、常にhashCodeをオーバーライドする)

P35
  hash値は同一でも良い
    --> できるだけ散らばるように返すのが望ましい

P36
  java.lang.ObjectのhashCodeメソッドはnativeメソッドである
    --> メモリアドレスの下4桁を返すらしい
        --> VMの実装に依存すると思われる

P37
  「>>>」の動作は?
    --> 符号の処理が違う

  17と37とが採用されている理由は?
    --> ハッシュテーブルのサイズに近い値?
    --> 統計学的に推奨されている数字なのか?
        --> 情報求む!!


◆ 打ち上げ
     一次会は14名にて近くの居酒屋「天狗」で17:00より開始。早い時間のため、
   ほかにお客さんがいませんでした。お一方\2,000也。
     ほかのテーブルの方々はどんな話題で盛り上がっていたのでしょうか。XMLに
   疎い私はXML関連の話題には付いて行けず。(^^;

◆ さいごに
     翻訳者の柴田さんには、東京近郊にお住まいであれば、読書会に参加いただけ
   るように交渉してみようかしら、と思ったりしてます。
     幸い6月は午後のみの開催となりそうですし、ちょっとだけでも顔を出していた
   だけるとうれしいな...


[ 戻る ]