2010年3月31日水曜日

Effective javaまとめ2 シングルトーーン

シングルトンは、一度しかインスタンスが作成されないクラスである。
通常、システムとして本質的に1つか存在し得ない事象を表すための使用する。

シングルトンを実装するには2つの方法がある。

1.コンストラクタをprivateとし、そのクラスのインスタンスへのアクセスは、public static finalなメンバーを提供する。

public class Mackagy {
public static final Mackagy INSTANCE = new Mackagy();
private Mackagy() {
.....
}
}

privateなコンストラクタのみを提供することで、Mackagyのインスタンスは常に1つしか存在しないことを保証する。

2.コンストラクタをprivateとし、publicなstaticファクトリーメソッドを提供する。

public class Mackagy {
private static final Mackagy INSTANCE = new Mackagy();
privte Mackagy () {
....
}
public static Mackagy getInstance() {
return INSTANCE;
}
}

1つめの方法の長所は、クラスを構成しているメンバーの宣言から、そのクラスがシングルトンであることが明確であること。(public staticなフィールドがfinalなので、そのフィールドは常に同一のオブジェクト参照を保持する)

2つめの方法の長所は、APIを変更することなく、そのクラスがシングルトンであるべきかどうかを変更できる柔軟性があること。

したがって、そのクラスが永久にシングルトンであることを確信できるのであれば方法1、確信がないのであれば方法2を使用するべき。

→ おわり




2010年3月28日日曜日

Effective javaまとめ1 staticファクトリメソッド2

Effective java P5~P9
項目1 コンストラクタの代わりにstaticファクトリーメソッドの提供を検討する

----->前回からの続き
staticファクトリーメソッドのメリット

3:戻り値型を定義することができる
つまり、戻り値型のサブタイプのオブジェクトを返すことが可能である。
これは、以下の特徴を持つ。
●staticファクトリーメソッドが作成された段階で、実際に返すクラスが未作成でも問題が無い
(戻り値型のサブクラスや実装クラスをあとで作成し、切り替えることが可能)
●受け取ったパラメータに応じて、別々のクラスのインスタンスを返すことが可能
●返すインスタンスのクラスをpublicにする必要がない
(親クラス、またはIFがpublicであれば、返すクラス自身はprivateで問題が無い)
→java.util.Collectionsクラスがこれを実践している

メリットを挙げてきたが、デメリットは以下の通り。
1.隠蔽されたクラスや、privteなコンストラクタしか持たないクラスは、拡張することができない
これはコンポジションを使うことで回避可能

2.他のstaticメソッドと区別がつきにくい
コンストラクタはAPIドキュメンテーションにおいて目立が、staticファクトリーメソッドは目立たないため、そのクラスのインスタンス化方法を知ることが困難になる場合がある。
これは、一般的な命名規則に基づいてメソッド名をつけることで軽減できる。
(valueOf、 geInstanceなど)

最後に、staticファクトリーメソッドを使う強い理由がない場合、コンストラクタを提供するべき。
なぜなら、それが通常の方法だから。

---> おわり

2010年3月26日金曜日

Effective javaまとめ1 staticファクトリメソッド1

Effective java P5~P9
項目1 コンストラクタの代わりにstaticファクトリーメソッドの提供を検討する

クランスのインスタンスを取得する方法として、通常はコンストラクタを提供するが、publicなstaticファクトリーメソッドを提供することもできる。

staticファクトリーメソッドとは、そのクラスのインスタンスを返す単なるstaticメソッドである。

例)Booleanクラスで提供されているstaticファクトリメソッド

public static Boolean valueOf(boolean b) {
  return (b ? Boolean.TRUE : Boolean.FALSE);
}

staticファクトリーメソッドの長所は以下の通り。

1:名前を持つことが出来る
コンストラクタと違い、自由に名前をつけることが可能なため、そのメソッドの返すインスタンスの特性をメソッド名として表現することができる。
→ ファクトリーメソッドを持つクラスの使用が用意になる。クライアントのコードの可読性が上がる。

また、オーバーロードの制約も気にする必要がない(名前をつけられるから)

2:メソッドが呼び出されるごとに新しいインスタンスを生成する必要が無い
ファクトリーメソッドで、予め生成された不変クラスのインスタンスを返すようにすることで、不必要な重複したオブジェクトの生成を回避することができる。
つまり、繰り返し呼び出しを行われても、返されるインスタンスは常に同一、ということを保証することができる。(オブジェクトの同一性の比較にequalsメソッドではなく==が使用可能)

3:戻り値型を定義することができる
つまり、戻り値型のサブタイプのオブジェクトを返すことが可能である。

-----> 疲れたので 続く

ほんでよんだ

インプットされたことは、アウトプットすることで身につくらしい。
今更ながらEffective Javaを1章づつアウトプットしていきます。ちなみに1.4のやつ。
次に1.5のやつで。

2010年3月17日水曜日

Oracle DAB1 Silver 10g

今更ながらOracle DBA1 silver 10g 受けてきました。
なぜ11gじゃなくて10gなのかは秘密です。

数年前に9iのsilverを取得したときは、あんまりためになったとは思わなかったんですが、ある程度業務でoracleを使った今、試験勉強してみとぜんぜん理解度が違います。
かなりためになりました。ふつーに業務で活かせる雰囲気です。

ということで、試験勉強して重要だなーと思った箇所とか、もっと深く掘り下げたいと感じた部分をまとめていこうと思います。