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

[jfriends-ml 10277] Effective Java 第 5 回議事録



EffectivaJava 第5回議事録 2002年 9月21日 @田町
 高橋徹 高橋智 布留川 山城 新井 瀬山 宮本 村上
 天野 石黒 根本(記) 鈴木

P155 より
項目38
■  昔はFQCNは大文字で書いていたが、いまは全て小文字
■  全世界ユニークな名前付けで、 jp.gr.java_conf.* というpackage名がもらえ
る。
  IAJがドメイン管理している。自分だけのpackage名を持ちましょう!!
■  boot strapより前に読み込ませれはせ java.lang.* などもimport可能と思われ
る、
  通常はjava.*のimportは拒絶される。
■  ハンガリアン表記は、C#はハンガリアンは推奨していない。
  FQCNでしか本当の形はあらわせないのでオブジェクトに
  ハンガリアンするのはもうあきらめましょう。
■  isXXXXは使わない方向にしましょう、非英語圏からみればgetXXXで十分。
■  com.speed()は field直結であることがイメージできない
   com.getSpeed()なら fieldに対するgetterであると感じられる。
   この例はよろしくない。
■  asXXXX()は使わない。 toXXXXX()と区別つかない。
■  getInstance()はsingletonのイメージがあるが、単にインスタンス取得の意味で
しかない。
項目39
■  P160上、この推奨利用方法は、スレッドセーフではない、これでいいのか
 for (Iterator i = collection.iterator(); i.hasNext();) {
  Foo foo = (Foo) i.next();
  ............
 }
 むしろ
 try {
   Iterator i = collection.iterator();
   while(true) {
     Foo foo = (Foo )i.next();
     ....
   }
 } catch (NoSuchElementException e) {
 }
 はたとえどんなに遅くとも、平行操作に対する耐性が有る。
 他のスレッドからiteratorをいじられても感知できる。
 しかし一方
 event handlerの通知モデルのように、snapshotを撮ってiterateすればよいともい
える。
 arraycopyでコピる負荷はあるが、これならiterator自体はまわせる。
 ただしobject消滅は常に確認すべき。
 これはObserverパターンのかかえる基本的課題。
項目40
■   java1.4から chained error処理が可能。
項目41
■  memory errorは システムエラーなので exceptionの中でnewしても問題ない。
  仮にメモリー不足報告オブジェクトを生成しようとしてもその前にVM死んでい
る。
■ runtime exceptionは printStackTraceされるので、e.printStackTraceしなく
てもよい
■ cloneは必ずcloneNotSupportedExceptionおきえるので必須。
項目42  
■  ArithmeticException = 0で割った tan(90度)とか。
■  javaプログラマーはトレースのためにifdefをほしがってはいけない、
  アスペクト思考でtraceを挿入すべき。
項目43
項目44
■  ConcurrentModificationExceptionは元に戻るfixできない。
■  interfaceのjavadocの @throw に要件を書かれたらその実装者はかならず
  そういうthrowを実装しなくてはいけない言語使用にしたほうが厳しくてよいか
も。
項目45
項目46
■ ConcurrentMidificatioExceptionは中間状態に値がセットされることがあるので
元に戻せない。
項目47
■ printStakTraceは System.oerr.println() なので マスクすればfileへのリダ
イレクトも可能
  製品版にするときはスタックはファイルに落として画面は、「混雑しておりま
す」
  くらいにしておいてトボけるのが吉。
項目48
■ return nextSZerialNumber++は2つの操作の合体した単項演算子なので、
  アトミック操作ではない。 <-- 間違いそう、要注意。
■ P182. double-checked lokingがなぜ動かないか。
 private static Foo foo = null;
 public static Foo getFoo() {
  if (foo == null) {             <---- A
     synchronized (Foo.class) {
     if (foo==null)
     foo = new Foo();
     }
  }
  return foo;                    <---- B
}

fooはまだ出来上がってはいないが、nullではなくなっている時、Aは不成立して
B点で不完全なfooが返っていく。という理解であったが。
しかし、そのうちfooは完成してしまうのでは?
 double-checked locking についてお勧めURL、これを見るだけで十分。
 他にもwww.javaworld.comにもいろいろ書いてありますが、すべてこの記事のサブ
セットです。
    http://www-6.ibm.com/jp/developerworks/java/020726/j_j-dcl.html
■ そもそもnullの評価で、例外に飛ぶこと以外やっていいのか、
  null-->インスタンス化-->nullのタイミングはJVMに依存しているのでは。
■ P183 上 いつnewするのか
  // 怠けていないstatic初期化
  private static final Foo foo = new Foo();
 これは本当に初期化するのか、foo staticクラスのフィールドの最低ひとつに
 さわりにいかないとJVMはこの初期化をサボる可能性あり。
■ オンデマンド初期化ホルダー
    CORBAっぽい。
■ volatileを正しく実装していないVMがあるらしい、使用禁止!!!。
    JCK Java Compatibility Kit のテストが通ればいい、
    dug Leeはvolatileはまだmemory model compatiblity test
    をクリアしていない。から使うな、といっている。

雑談ネタ
■ JavaOne皆さん1/3くらい行くみたいです、高橋さん初日Borlandブースだそう
です。
■ 来年くらいからはEAI( Enterprize Application Integraton)がホットになるは
ず。
■ 次回課題図書、次までには決めましょう。

    次回は 項目49から
以上    根本和郎