33
Effective Java 読読読 Java 読読読読読読読読

Effective Java 読書会1

Embed Size (px)

Citation preview

Page 1: Effective Java 読書会1

Effective Java 読書会

第一回 Java の基本的なお作法

Page 2: Effective Java 読書会1

この読書会の目的

Effective-Java を読み進める

講師が内容をまとめて、情報共有する

まともに読まずに読んだ気にする

Page 3: Effective Java 読書会1

Effective Java 第二版

Java のお作法が書いている本

「 Java やってるなら一度は読んでなきゃモグリだよねww」って言われる本

定価 3780円

ライブラリにも置いてます

Effective Java について

Page 4: Effective Java 読書会1

この読書会の進め方

Effective-Java の内容(章ごと)をまとめる

内容は講師が決めて良い。

次回の読書会の講師はその読書会中に決める

全部理解しなくてもいい。わかったところだけで OK

Page 5: Effective Java 読書会1

本書 p.203 〜 p.232第 8 章 プログラミング一般

Page 6: Effective Java 読書会1

項目45

ローカル変数のスコープを最小限にするローカル変数のスコープを最小にする最も強力な方法は、ローカル変数が初めて使用されたときに宣言すること。

ほとんどすべてのローカル変数宣言は、初期化子を含んでいるべき。

とくにループ変数では、そうであるべき。

Page 7: Effective Java 読書会1

項目45

ローカル変数のスコープを最小限にするイテレータを用いるとき

スコープの大きいローカル変数はバグを引き起こしやすいコンパイルが通ってしまう

Page 8: Effective Java 読書会1

項目45

ローカル変数のスコープを最小限にするそんなものより、 for 使おうぜ

これだとコンパイル時にエラーになる↓

Page 9: Effective Java 読書会1

項目46

従来の for ループより for-each ループを選ぶでも、そんなものより for-each 使おうぜ

コレクションをイテレートするならこれ!すごいシンプル! Iterator とは一体何だったんだ!

Page 10: Effective Java 読書会1

項目46

従来の for ループより for-each ループを選ぶ6面ダイスのサイコロを2つ転がして、表示されるダイスの組み合わせをすべて表示したい

これにはバグがある

Page 11: Effective Java 読書会1

項目46

従来の for ループより for-each ループを選ぶ6種類しか表示されない

Why ?

i と j が並行してイテレートされている内側の for の前に i をコピーする必要がある

Page 12: Effective Java 読書会1

項目46

ローカル変数のスコープを最小限にするfor-each ならこれでできる

ループ変数とは何だったんだ

Page 13: Effective Java 読書会1

項目46

ローカル変数のスコープを最小限にするただし、以下の3つの時は従来の for 文を使うしか無い

フィルタリング・変換元のコレクションを書き換える場合

並列イテレーション同時にイテレーションやインデックス変数を動かす場合

Java 1.5 以前の Java を利用するときジェネリクスや for-each が使えない場合

Page 14: Effective Java 読書会1

項目46

ローカル変数のスコープを最小限にする

whileより forより for-eachを使おう!

Page 15: Effective Java 読書会1

項目47

ライブラリを知り、ライブラリを使う1〜9のランダムな Integer を受け取って、与えられた数を返すプログラムを作成。ただし、同じ数はカウントしてはいけない。

Page 16: Effective Java 読書会1

項目47

ライブラリを知り、ライブラリを使うああ、それ Set で同じ事できるよ

自分で書くより汎用的!バグも少ない!

Java プログラマなら、 java.lang 、 java.util 、 java.io の中身は良く知ってて当然ですよね

Page 17: Effective Java 読書会1

項目48

正確な答えが必要ならば、 float と double を避け

るfloat と double は2進不動小数点を使う

これらでは正確に小数点を表現することができない

/ (^o^) \ナンテコッタイ正確に値を入力するには int で計算し、10 ^n で割る。

Page 18: Effective Java 読書会1

項目49

ボクシングされた基本データより基本データ型を選ぶ基本データ型

int, float, boolean ….

参照型

String, List, Vector …..

ボクシングされた基本データ

すべての基本データ型の代用の参照型のこと int → Integer の Integer のこと。

Page 19: Effective Java 読書会1

項目49

ボクシングされた基本データより基本データ型を選ぶ違いは3つある

基本データ型は値のみを持つが、ボクシングされた基本データは値以外のアイデンティティ ( 参照先アドレス ) を持っている。

値は同じでも違うインスタンスということ

==使わない

基本データ型は null を受け付けないので注意

基本てデータ型はボクササイズされた基本データ型より効率がいい

Page 20: Effective Java 読書会1

項目49

ボクシングされた基本データより基本データ型を選ぶ間違ってもこんなことはしないように

Page 21: Effective Java 読書会1

項目50

他の型が適切な場所では、文字列を避ける文字列では、他の値型に対する代替としては貧弱です

1,2,3 などは int, yes/no みたいなものは boolean

文字列は、列挙型に対する代替としては貧弱です

Enum >>>>>>>>>> 文字列 第30項目で説明がります

文字列では、集合型に対する代替としては貧弱です

めんどくさくても Class を定義しましょう

Page 22: Effective Java 読書会1

項目51

文字列連結のパフォーマンスに用心するString の結合は超遅い

O(n^2) の時間が必要

文字列連結には StringBuilder を使おう

StringBuilder には append という連結するのメソッドがある

ループを100回しただけで、85倍の差が出る…らしい

未実証なので後でやると面白いかも

Page 23: Effective Java 読書会1

項目52

インターフェースでオブジェクトを参照する参照はなるべくインタフェースで受けましょう

元のクラスが修正されたときに、インタフェースが同じであれば編集する部分が少なくて済みます。

Page 24: Effective Java 読書会1

項目53

リフレクションよりインタフェースを選ぶJava.lang.reflect に関する項目

インスタンスにインタフェースを使う

型が明示的だから、分かりやすい。

型がわからないときは使えない

Page 25: Effective Java 読書会1

項目53

リフレクションよりインタフェースを選ぶこのような記述よりも

インタフェースで受け取る(ここでは Gal はインターフェースじゃないが…)

Page 26: Effective Java 読書会1

項目54

ネイティブメソッドを注意して使用するJNI(Java Native Interface) というのがある

C や C++ で書かれたメソッドを呼び出す機能

プラットフォーム固有の機構にアクセスしたい時

古いコードへアクセスしたい時

パフォーマンスを高めたい

Page 27: Effective Java 読書会1

項目54

ネイティブメソッドを注意して使用するネイティブメソッドは使うな!

Java 1.3 以前は利用されていたが、現在は JVM は早くなっており、必要ない

安全じゃない

保守が大変

場合によってはパフォーマンスが悪くなってしまう

Page 28: Effective Java 読書会1

項目55

注意して最適化する最適化とは (ソースコードレベル )

コードの可読性や安全性を犠牲にして、パフォーマンスを向上させることリファクタリングとは違うコンパイラの最適化ともちょっと違う

Page 29: Effective Java 読書会1

項目55

注意して最適化する原則として最適化を行わないこと

最適化は悪の根源

速いプログラムよりも良いプログラムを書くこと

Page 30: Effective Java 読書会1

項目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

Page 31: Effective Java 読書会1

項目56

一般的に受け入れられている命名規約を守るなにか動作するメソッド名は動詞で始める

makeValue, drawImage, append

Boolean は is/has で始める

isEmpty, hasNext, isEnabled

アクセサは get/set で始める

getType, setValue

Page 32: Effective Java 読書会1

まとめ

項目45 ローカル変数のスコープを最小限にする

項目46 従来の for 文より for-each 文を使う

項目47 ライブラリーを知り、ライブラリーを使う

項目48 正確な答えが必要ならば、 float,double を避ける

項目49 ボクシングされた基本データ型より基本データ型を選ぶ

項目50 他の型が適切な場所では、文字列を避ける

項目51 文字列連結のパフォーマンスに用心する

Page 33: Effective Java 読書会1

まとめ

項目52 インタフェースでオブジェクトを参照する

項目53 リフレクションよりインタフェースを選ぶ

項目54 ネイティブメソッドを注意して使用する

項目55 注意して最適化する

項目56 一般的に受け入れられている命名規則を守る