Effective Java 読書会1

4,307 views

Published on

Published in: Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,307
On SlideShare
0
From Embeds
0
Number of Embeds
1,238
Actions
Shares
0
Downloads
14
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Effective Java 読書会1

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

×