[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[jfriends-ml 10122] 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月は午後のみの開催となりそうですし、ちょっとだけでも顔を出していた
   だけるとうれしいな...
-- 
高橋智宏
  Java読書会( http://www.t3-jpn.com/bof/ )
  T3-Japan( http://www.t3-jpn.com/ )