村山です.
遅れましたが,前回の議事録です.
なお,Adaの入門書をちょっと見た程度では"named optional parameter"に
関する記述は見つけられませんでした.
--------------------------------------------------------------
Java読書会議事録 Effective Java 2nd edition.(第一回)
参加者:
高橋(智),高橋(徹),久保田,遠藤,村山,松永,
宮本,吉本,小棚木,門脇,高江洲,前山,石黒
--------------------------------------------------------------------
・Javaのソースバージョンとターゲットバージョンで,
ソースバージョン6&ターゲットバージョン5というのは可能か?
バージョン5とバージョン6の違いは.
6で追加したAPIを使いたい時にターゲットバージョン1.5で動かして問題はないか.
6のコードを5のVMでロードは可能だが,実行中にエラーになる.
ソースバージョンを6を使っている時に,ソースバージョン6にする必要はあるか?
・P3
"The language supports four kinds of types:interfaces(including annotations) classes(including enums)"
の (including annotations) と (including enums) 部分が追加.
------------------------------------
○Item1
・サンプルコードなど若干変更部分あり.
・「GoFのFactoryメソッドとちょっと違うよ」
Flyweightパターンへの言及を追加.
・P6,Enum型への言及が追加
・P7,「32のコレクション」
"The Java Collections Framework has thirty-two convenience implementations of its collection interfaces."
初版では20個だった.
java.util.concurrent関係も数えてるのかも
・P7,java.util.EnumSetへの言及追加.
EnumSetで64個以下だったら内部的に単一のlongを使ったRegularEnumSetインスタンスを返すが,
それ以上だと内部的にはlongの配列を使ったJunboEnumSetインスタンスを返す.
・P7の一番下の段落
挙げている例は,初版はJava Cryptography Extension(JCE)だったが,
第二版ではJava Database Connectivity (JDBC)に変更.
JCEはマイナーだからでは?
・P8後半~P9のサンプルコードが大幅加筆変更
P9はほぼ全部追加
・P9.型推論は最近の言語のウリ.Haskellなど.
・P9.EclipseならHashMap<String , List<String>>みたいなものは自動的に補間してくれる.
補間を打つタイミングにも依存.
Eclipseは
「HashMap」なら補間してくれる.
「HashMap<」まで行くと補間してくれない.
「Map<String , List<String>> m = new HashMap」
みたいな感じでも補間してくれる.
・P10.代表的なstaticファクトリーメソッドの名前が,2版で幾つか追加.
初版ではvalueOf,getInstanceのみ.
2版では,これに加えて,of, newInstance, getType, newTypeが追加.
createInstance()がないけど,これはなぜ?
ofは一件奇妙だが,EnumSetではofは意味が通る.
------------------------------------
○P11,Item2
Item2全体が二版で新規に追加された項目.
・"Effective Java Reloaded"で扱っていた内容?
・finalである必要は? => 不変にしたいから.
不変でなければJavaBeansでいいのでは.
可変では,わざわざBuilderを使う意味がない.
・メンテナンス性は低くないか?
多少面倒ではある
・不変な性質を持つものはBuilderに適している.
・Hibernateのセッションインターフェース/セッションファクトリーがこんな感じで,うまくできている.
例えばDBMSのホスト名とかが,ある時もあればない時もあるし,後で変更したい時もある.
「作った結果」に関しては変更できない(不変オブジェクト)方が良い.
Configuration的なものには適切.
・P15,AdaやPythonで見られるような「named optional parameters」
「名前付きオプションパラメータ」でいいの? => 宿題
------------------------------------
○Item3
・P17,具体例を変更
1版:ビデオディスプレイ
2版:WindoManager
ディスプレイは一つとは限らない。
・P17,"Makeing a class a singleton can make it difficult to test its clients,~
「シングルトンはサブクラス化を禁止し,インターフェースも使わないから.
モックに置き換えられないのでテストが難しくなる」という意味では
・P17,"Before release 1.5"が追加.
1.5以後では別のやり方もある.
・P17."with one caveat~以下の「リフレクションを使えば変更可能云々」の部分が追加.
・P18,2版変更点.
"There is no longer any performance advantage to the public field approach..."
若干記述が変更されている.
初版では:public fieldには若干のパフォーマンス上のメリットがある.
2版では:public fieldには,パフォーマンス上のメリットはもはやない.
・P18 真ん中あたり,"declare all instance field transient "
が二版で追加.
・P18,As of release 1.5, there is a third approach to implementing singletons.
Simply make an enum type with one element.~
三つ目の実装方法とそのサンプルコードが追加.
・P18最後,結論も二版で変更.
「最良の実装方法は single-element enum typeだ」
これについては,「なんとなく気持ち悪い」という意見も.
------------------------------------
○Item4
・サンプルコードにAssertionError(); が追加.
その後の解説部分も追加.
・コンパイルエラーにできない? => 言語を変更しない限り無理
deprecatedを付ける.警告が出るだけマシ.
------------------------------------
○Item5
・ほとんど一緒だけど,AutoBoxingに関する変更あり.
・P20,サンプルコード中の文字列.
"silly" => "stringette" に変更.
"stringette"で検索すると,EffectiveJavaに関するページが見つかるらしい.
・P20最後の段落の数行ほど,クラス説明部を二版で追加.
・P20,サンプルコードのコンストラクタを省略.
・22P 計測条件と計測結果が変更されている.
初版:百万回 36000ms(ダメ版)/370ms(改良版)
第二版:一千万回 32000ms(ダメ版)/130ms(改良版)
ハードとVMが進歩した結果が見て取れる.
・P22ラスト~23真ん中あたりまで.2版追加部
longとLongのタイプミスで予期しないオートボクシングが発生し,パフォーマンスが落ちる例を紹介.
--------------------------------------------------------------------
以上.