[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[jfriends-ml 10183] 「 Effective Jav  プログラミングガイド」 第 2 回 読書会議事録



2002年 6月22日 10:00-17:00 @目黒勤労福祉会館4F和室

参加者
  佐藤慶治  村山敏清  荒井彩子  中村圭輔  門脇太郎  吉関 コセキ 
天野 
  高橋(徹)  高橋(智)  福島航   山本貴士  伊藤哲   根本和郎(記) 
鈴木 石黒


p38 Hash code より再開

○ volatileについて
  private volatile int hashCode =0;
   について intはアトミック処理をするが、読み出しの場合はvolatile必須。

○ hashmapに長いstringは入れるな
  ハッシュテーブルの構造は事前に、理解していること、hashそのものの説明はな
い。

 hashcodeの計算は最初の数文字だけを見るのでhashが1個所に集中することがあ
る。
 stringのhashmapはキャッシュするだけで早くなるかもしれない(テスト必要)。
 stringのget/putは指定キーの設定が大変
 長いstringの比較をすると、大変時間が掛かるはず、optimize itを買ってでパ
フォーマンスを比較しましょう
 toStringにMD5を使ってみるのはどうか、ユニークさを保って速く処理できそう。
 詳しくはsource.jarを見ましょう
 日本語として記述が不明瞭な点 「 向き合うことになるかもしれません」--> 「問
題となります。」
 1文字おきの16文字までの比較がstringのhashmapの算出だがローマ字の比較におい
て母音があたると不利。
 defaultのhashcodeの実装形態はべき乗を使っており、遅そう
 なおoverflowに関しては下側32bitは切り捨て処理をしつづけるので一箇所に固
まることはない。

○  Thread[main. 5,main]の意味
  Thread[名前,ブライオリティ,グループ]  これを知っている人は何人? 説明がな
いのでキビシイ。

○ toStringのフォーマット変更は途中からは不可能
 XMLに埋め込むときに string --> ここのデータにする
  toStringではなくマーシャルするべき、 accessorで取り出せないものは解析す
べきではない。
  log出力のparseが主たる用途か、ならJava1.4のlog機能を使うべきか。
  あとはlog4jをしっかり勉強して考えましょう。
  java.util.text のformatterは書式指定が使いにくい、右詰はなかったハズ
 
 
項目10 clone

○ getlass()の一致はObjectクラス
 super.clone()はjava.lang.Objectに到達するまで上に上がりつづける。
 Java.lang.Object()の実装は shallow copy
  transientフィールドはcloneでcopyされるか実験必要

 再帰呼び出しは実際はreturnの中で呼んでいる。

 hashtableの複製とは新しいテーブルにコピーすること。
  super.clone()でhushtableを新規に作る。
  同じ手順で複製する。
  全く同じモノを同じように作る。
  deepcopyのclone() とは constructor()と同じ、じゃ複製ではなくて生成ではな
いか。
  
  clone()メソッドにかかわらずコンストラクター デシリアライズは危険メソッド
として注意がいる。
  極論すれば生成に関与するメソッドは全て注意すること。
  copyConstructor()を利用したほうが良い。

  p50 訳注
  clonable()は、method objectを生成してinvokeする reflectionならにげられる
が
  実際にはそのままでは複製できない、  基本的には自分で作らなければ、使うこ
とはできない。
  
  ArrayCopy と配列のcopy は何が違う
  Objet[].x={A,B,C}とは  Object[]y=x.clone(); でいいのではないか。
  ArrayCopyは長さの一致しない配列の複製に使用可能(確認必要)
  
○ comparebleの実装
  
第4章 クラスとインターフェイス  
  
  JLS6.6.2の示す例外
    親クラスのprotectedは見えるが、派生した自分以外の子クラスのインスタン
スには見に行けない。
   (親は見えるが兄弟は、別物)
項目13 不変性を選ぶ
  getxxx()のgetは省略してもいいこととすることもできる、isXXXX()はあんまり
考えない。
  bean仕様準拠のできそこない見たいに考えてよいのかも。

○ memorymodelの考え方
  複数スレッドに対してどのようにメモリが見えるかどうか。
  別Threadが同一オブシェクトに対してどのようにアクセスするかどうか。
  volatileの意味
     =Cは最適化指示
     =Javaではdoubleとlongのアクセスのアトミック性を保証すること。
         Synchronizeなしでも最新のデータを保証する。
  mutator=可変行為をするメソッド=setter()       (mutant=突然変異)

    不変クラスのfinalizeの仕方は classをfinalにするか各methodをfinalにする
かのどちらかである。
  Template method(GoF)の考え方とは異なり、不変クラスの考え方である。

p67
  ソース中resultローカル変数の存在意義はread once write onceの実現の為
  そうでないと訳注の様に、2回読み込みが発生して、値が変わるおそれがある。
  参考(double-locked checkイディオム)

コンストラクターの中でThreadをスタートするような人がいるが
まだオブジェクト生成が完了しないうちに走らせると危険。

 start()すると優先的にthreadが回りだすことがある。
 yield()をJVMが必ずしも正しく処理する可能性はない、気休めにしかならない。

次回はp69 項目14 継承よりコンポジション より。

以上

根本和郎