読者です 読者をやめる 読者になる 読者になる

DRYな備忘録

Don't Repeat Yourself.

恥ずかしいデザインパターン勉強会第1回【Singleton】 #hazukac

第1回なので

Javaデザインパターンもほぼ何もしらない状態で今更ですが「Javaデザインパターンを継続的かつ網羅的に学習する」きっかけとして「恥ずかしい勉強会」を改めて開催しました。最初なのでSingletonパターンをやりました。一番簡単で直感的だから。ライブコーディングもしました。そのログです↓

Singletonパターン

ユースケース

  • インスタンスが一つしか無い感じに書くのならglobalなstatic変数でいいんだけど
  • インスタンスが一つしか無いことを保証する書き方をしたい
  • 組み込みなんかであるのは「単一デバイスへのアクセス」「constructで電源オン、以降電源オンを保証」とか

ポイント

ツッコミとか

公開するインスタンス取得メソッドでやる

package my;
public class Hoge {
    private static Hoge instance = null;
    public static synchronized Hoge getInstance() {
        if (instance == null) {
            instance = new Hoge();
        }
        return instance;
    }
}
// 複数スレッドからgetInstanceが呼ばれる機会が多い場合
// synchronizedキーワードによる複数スレッドの同調が
// 処理そのものを遅くする可能性がある

classロード時にやる場合

package my;
public class Hoge {
    private static Hoge instance = new Hoge();
    public static Hoge getInstance() {
        return instance;
    }
}
// シングルトンで管理したいクラスが巨大でありなおかつ
// getInstanceが呼ばれるかどうかすら分からないほど稀な場合
// staticで確保するinstanceがもったいない場合がある

その他Java初修者としての学び

  1. package宣言は一行目。importとかより先に書かなければならない。
  2. package定義を編集した場合、それをimportするクラスをコンパイルする前にpackageコンパイルする必要がある。
  3. 宣言と代入は一行で行える。例 Hoge hoge = new Hoge();
  4. privatepublicキーワードを付けずに宣言したプロパティやメソッドdefaultという公開範囲になる。
    • default同パッケージ内でアクセス可能という公開範囲
  5. Dateクラスはjava.utilパッケージにあるよ。
  6. Threadクラスはデフォルトで参照できるよ。
  7. Thread.sleepは必ずtry-catchで包む必要があるよ。

雑感

f:id:otiai10:20140723234724j:plain