• ベストアンサー

singletonパターン

デザインパターンを勉強しているのですが、一つ気になっていることがあります。singletonパターンを使うとき、staticなメソッドgetInstance();で、唯一のインスタンスを得る場合、コードは Singleton obj1 = Singleton.getInstance(); となります。ここで疑問に思ったんですが、あるメソッドを使う場合、 instance名.method();という具合に記述されるんですが、この場合、 class名.method();となっています。メソッドを使うときって、class名.method();でも大丈夫なんですか?質問文がわかりにくいかもしれませんがどうぞよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

通常はクラス自身は作業領域にないので操作(メソッドの使用)できません。操作する場合はその複製(オブジェクト)を作業領域に作成して、操作します。ただし、Static(静的)なメソッドは動的なメンバーと違い、作業領域を決め打ち(静的に)で確保します。よって、直接使用できます。 ちょっと説明に御幣があるところがありますがイメージ的にこんな感じです。私の説明に分かり難いところがありましたら、補足をお願いいたします。

serasa
質問者

補足

ありがとうございます。メソッドがstaticだからできるのでしょうか?それともclassがstaticだからでしょうか?この部分だけもう一度お願いします。すみません。。

その他の回答 (3)

回答No.4

staticというのは、そのクラス自体の属性(グローバル変数)やふるまい(メソッド)ですよ、というのを示す修飾子です。 クラスとインスタンスはよくクッキー型とクッキーに例えられると思うのですが、クッキー型がハートの形をしているというような情報はstaticです。その型で作られたクッキー(インスタンス)はすべてハート型ですね。 singletonに話をもどしますと、そのクッキー型はたった1つだけしかクッキーを作りません。誰かが勝手に新しいクッキーを作ろうとしてもできないようにしています(コンストラクタをpriveteにしているはずです)。クッキーを手に入れたいと思ったら、そのクッキー型に「クッキーをちょうだい」と頼むしかありません。それがgetInstanceメソッドです。 No.3さんがおっしゃているように、singletonになるかどうかはgetInstanceメソッドの中の実装次第です。「クッキーちょうだい」と言われたときに、まだ1つも作っていなければ、作ってそれを返します。すでに作ったことがある場合は、その前に作ったものを返します。前の人がもらったクッキーと、新しくもらったクッキーはまったく同じものです(クッキーだとイメージしにくいですね…)。 つまり、インスタンスをやり取りするとき、インスタンスそのものを渡すのではなく、そのインスタンスが存在している場所を渡しているのです。singletonでは、常に同じ場所(同じインスタンス)を返しているのです。 例えが下手ですみません。なんとなくわかっていただけたでしょうか。

回答No.3

ちょっと勘違いをしているかな?クラスのインスタンスとしてオブジェクトを生成するのです。インスタンスにはStaticという概念がありません。Staticになるのはオブジェクト変数です。たぶんですが、 Singleton obj1 = Singleton.getInstance(); このステップを勘違いしている(特にgetInstanceの部分)のだと思いますので、ちょっと説明します。 クラスのインスタンスを生成する場合は、以下のように書きます。 Singleton obj1 = new Singleton(); これはSingletonクラス型のオブジェクト変数obj1を宣言し(左辺)、Singletonクラスのインスタンスを作成し(右辺)、代入しています。 Singleton obj1 = Singleton.getInstance();はgetInstanceメソッドがSingletonオブジェクトを戻り値としているだけです。インスタンスを生成しているかどうかはgetInstanceメソッドの中身次第です。なんだか説明が微妙になってしまい申し訳ない。一度、Javaの仕様、構文の基礎を調べてみてはいかがでしょうか?

serasa
質問者

お礼

お礼を書くのが遅くなって申し訳ありませんでした。はい、もう一度調べてみます。どうもありがとうございました!!

回答No.2

#1です。補足の返信です。 メソッドがstaticだからです。クラス自体はStaticにできません。(ぶっきらぼうな回答になってしまいましたがご了承ください。)

serasa
質問者

補足

すみません、間違えました!インスタンスがstaticだからですか?たびたび申し訳ありません。いつでもいいのでどうかお願いしますm(__)m

関連するQ&A