2010年4月12日月曜日

Effective javaまとめ3 インスタンス化不可能を強制

FFくりーちゃーず2が6末に発売。待ちきれません。
http://www.amiami.com/shop/ProductInfo/product_id/158244/
今回のシークレットはなんだろうか・・・

------------------------------------------------------------
項目3 privateのコンストラクタでインスタンス化不可能を強制する

staticなメソッドとstaticなフィールドだけからなるクラスを作成するケースとして、
java.lang.Math、java.util.Arrays、java.Util.Collectionsのようなユーティリティクラスを作成する場合が挙げられます。

こういったクラスはインスタンス化する設計にはなっていません。(インスタンス化するメリットや意味がありません)しかし、明示的にコンストラクタを定義していない場合、コンパイラはpublicでパラメータ無しのデフォルトコンストラクタを提供します。つまり、インスタンス化するためのクラスではないのにインスタンス化が可能になってしまいます。

クラスを抽象化することでインスタンス化不可能を実現しようとしてもうまくいきません。そのクラスのサブクラスでインスタンス化可能とすることができるためです。更に、継承させるために設計されていると使用者に誤解を与えます。

そこで、ベストな方法としてprivateなコンストラクタを定義する、という方法があります。

public class BearBrick {
 private BearBrick() {}
}

「インスタンス化させたくない!」という意図をコメントしておくと親切です。

注意点として、privateなコンストラクタのみを保持するクラスはサブクラスが作成できません。
明示的、あるいは暗黙的に、すべてのコンストラクタはアクセス可能なスーパークラスのコンストラクタを呼び出さなければならないためです。
------------------------------------------------------------

参考に・・・

------------------------------------------------------------
java.lang.Math
------------------------------------------------------------
public final strictfp class Math {

/**
* Don't let anyone instantiate this class.
*/
private Math() {}

------------------------------------------------------------

------------------------------------------------------------
java.util.Arrays
------------------------------------------------------------
public class Arrays {
// Suppresses default constructor, ensuring non-instantiability.
private Arrays() {
}
------------------------------------------------------------

本ではユーティリティクラスに対して言及してましたが、全章でもあったように、シングルトンとして設計されたクラスでもprivateコンストラクタは使用しますですね。

どうでもえーですが、Mathのコンストラクタはprivateなのにjavadeoc形式なんですね。僕もMath派な人です。

0 件のコメント:

コメントを投稿