Upload
hiroaki-murayama
View
4.004
Download
4
Embed Size (px)
Citation preview
Effective Java 読書会
第一回 Java の基本的なお作法
この読書会の目的
Effective-Java を読み進める
講師が内容をまとめて、情報共有する
まともに読まずに読んだ気にする
Effective Java 第二版
Java のお作法が書いている本
「 Java やってるなら一度は読んでなきゃモグリだよねww」って言われる本
定価 3780円
ライブラリにも置いてます
Effective Java について
この読書会の進め方
Effective-Java の内容(章ごと)をまとめる
内容は講師が決めて良い。
次回の読書会の講師はその読書会中に決める
全部理解しなくてもいい。わかったところだけで OK
本書 p.203 〜 p.232第 8 章 プログラミング一般
項目45
ローカル変数のスコープを最小限にするローカル変数のスコープを最小にする最も強力な方法は、ローカル変数が初めて使用されたときに宣言すること。
ほとんどすべてのローカル変数宣言は、初期化子を含んでいるべき。
とくにループ変数では、そうであるべき。
項目45
ローカル変数のスコープを最小限にするイテレータを用いるとき
スコープの大きいローカル変数はバグを引き起こしやすいコンパイルが通ってしまう
項目45
ローカル変数のスコープを最小限にするそんなものより、 for 使おうぜ
これだとコンパイル時にエラーになる↓
項目46
従来の for ループより for-each ループを選ぶでも、そんなものより for-each 使おうぜ
コレクションをイテレートするならこれ!すごいシンプル! Iterator とは一体何だったんだ!
項目46
従来の for ループより for-each ループを選ぶ6面ダイスのサイコロを2つ転がして、表示されるダイスの組み合わせをすべて表示したい
これにはバグがある
項目46
従来の for ループより for-each ループを選ぶ6種類しか表示されない
Why ?
i と j が並行してイテレートされている内側の for の前に i をコピーする必要がある
項目46
ローカル変数のスコープを最小限にするfor-each ならこれでできる
ループ変数とは何だったんだ
項目46
ローカル変数のスコープを最小限にするただし、以下の3つの時は従来の for 文を使うしか無い
フィルタリング・変換元のコレクションを書き換える場合
並列イテレーション同時にイテレーションやインデックス変数を動かす場合
Java 1.5 以前の Java を利用するときジェネリクスや for-each が使えない場合
項目46
ローカル変数のスコープを最小限にする
whileより forより for-eachを使おう!
項目47
ライブラリを知り、ライブラリを使う1〜9のランダムな Integer を受け取って、与えられた数を返すプログラムを作成。ただし、同じ数はカウントしてはいけない。
項目47
ライブラリを知り、ライブラリを使うああ、それ Set で同じ事できるよ
自分で書くより汎用的!バグも少ない!
Java プログラマなら、 java.lang 、 java.util 、 java.io の中身は良く知ってて当然ですよね
項目48
正確な答えが必要ならば、 float と double を避け
るfloat と double は2進不動小数点を使う
これらでは正確に小数点を表現することができない
/ (^o^) \ナンテコッタイ正確に値を入力するには int で計算し、10 ^n で割る。
項目49
ボクシングされた基本データより基本データ型を選ぶ基本データ型
int, float, boolean ….
参照型
String, List, Vector …..
ボクシングされた基本データ
すべての基本データ型の代用の参照型のこと int → Integer の Integer のこと。
項目49
ボクシングされた基本データより基本データ型を選ぶ違いは3つある
基本データ型は値のみを持つが、ボクシングされた基本データは値以外のアイデンティティ ( 参照先アドレス ) を持っている。
値は同じでも違うインスタンスということ
==使わない
基本データ型は null を受け付けないので注意
基本てデータ型はボクササイズされた基本データ型より効率がいい
項目49
ボクシングされた基本データより基本データ型を選ぶ間違ってもこんなことはしないように
項目50
他の型が適切な場所では、文字列を避ける文字列では、他の値型に対する代替としては貧弱です
1,2,3 などは int, yes/no みたいなものは boolean
文字列は、列挙型に対する代替としては貧弱です
Enum >>>>>>>>>> 文字列 第30項目で説明がります
文字列では、集合型に対する代替としては貧弱です
めんどくさくても Class を定義しましょう
項目51
文字列連結のパフォーマンスに用心するString の結合は超遅い
O(n^2) の時間が必要
文字列連結には StringBuilder を使おう
StringBuilder には append という連結するのメソッドがある
ループを100回しただけで、85倍の差が出る…らしい
未実証なので後でやると面白いかも
項目52
インターフェースでオブジェクトを参照する参照はなるべくインタフェースで受けましょう
元のクラスが修正されたときに、インタフェースが同じであれば編集する部分が少なくて済みます。
項目53
リフレクションよりインタフェースを選ぶJava.lang.reflect に関する項目
インスタンスにインタフェースを使う
型が明示的だから、分かりやすい。
型がわからないときは使えない
項目53
リフレクションよりインタフェースを選ぶこのような記述よりも
インタフェースで受け取る(ここでは Gal はインターフェースじゃないが…)
項目54
ネイティブメソッドを注意して使用するJNI(Java Native Interface) というのがある
C や C++ で書かれたメソッドを呼び出す機能
プラットフォーム固有の機構にアクセスしたい時
古いコードへアクセスしたい時
パフォーマンスを高めたい
項目54
ネイティブメソッドを注意して使用するネイティブメソッドは使うな!
Java 1.3 以前は利用されていたが、現在は JVM は早くなっており、必要ない
安全じゃない
保守が大変
場合によってはパフォーマンスが悪くなってしまう
項目55
注意して最適化する最適化とは (ソースコードレベル )
コードの可読性や安全性を犠牲にして、パフォーマンスを向上させることリファクタリングとは違うコンパイラの最適化ともちょっと違う
項目55
注意して最適化する原則として最適化を行わないこと
最適化は悪の根源
速いプログラムよりも良いプログラムを書くこと
項目56
一般的に受け入れられている命名規約を守る修飾子名 例
パッケージ com.google.inject, jp.ac.fun.b1008241.MyClass
クラス、インターフェース Timer, FutureTask, LinkedHashMap
メソッド、フィールド remove, getValue, isEqual
定数フィールド GAME_CLEAR, SUCCESS, MAX_INTEGER
ローカル変数 I, xref, houseNumber
型パラメータ T, E, K, V, X
項目56
一般的に受け入れられている命名規約を守るなにか動作するメソッド名は動詞で始める
makeValue, drawImage, append
Boolean は is/has で始める
isEmpty, hasNext, isEnabled
アクセサは get/set で始める
getType, setValue
まとめ
項目45 ローカル変数のスコープを最小限にする
項目46 従来の for 文より for-each 文を使う
項目47 ライブラリーを知り、ライブラリーを使う
項目48 正確な答えが必要ならば、 float,double を避ける
項目49 ボクシングされた基本データ型より基本データ型を選ぶ
項目50 他の型が適切な場所では、文字列を避ける
項目51 文字列連結のパフォーマンスに用心する
まとめ
項目52 インタフェースでオブジェクトを参照する
項目53 リフレクションよりインタフェースを選ぶ
項目54 ネイティブメソッドを注意して使用する
項目55 注意して最適化する
項目56 一般的に受け入れられている命名規則を守る