読書会(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月は午後のみの開催となりそうですし、ちょっとだけでも顔を出していた
だけるとうれしいな...
[ 戻る ]