こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

クラス、インスタンスメソッドについて

JAVA初心者です。
現在、先人が作ったプログラムの修正作業を行っておりますが、
以下の点に疑問があります。(因みに、先人はJAVAのスペシャリストではありません。)

あるクラスが以下の様になっております。
public class Sample {

private static Sample s = new Sample();

private Sample() {
}

/** クラスメンバに存在するインスタンス取得
* @return Sampleクラスの唯一のインスタンス
*/
public static Sample getInstance(){
return s;
}

public static void methodA(){
...
}
}

でこのmethodAを使用するには、以下の様にします。
Sample.getInstance().methodA()

これはこれで納得で、うまく動作しますが、これは
結局の所、クラスメソッドにしたかったという事ではないのかな?と
疑問に感じています。つまり、単純に
Sample.methodA
と呼び出せばうまくいきます。

ところが、たまたまAPIドキュメントを見ていた所、Calendarクラスにもやはり
getInstanceというものが存在し、現在日時を取得するのに
Calendar.getInstance().getTime()
の様に呼び出すと書いてありました。

Sampleクラス、JAVAのCalendarクラス(これに限った事では無いとは思いますが)
のこれらのgetInstanceの効用とはなんなんでしょうか?
・クラスの外でnewでインスタンスを作り出さない所
・それでいてクラスメソッドではない(?)所
この辺りについてご回答よろしくお願いします。

投稿日時 - 2003-04-15 14:32:46

QNo.523414

すぐに回答ほしいです

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

getInstance()メソッドについてですが、
>・クラスの外でnewでインスタンスを作り出さない所
デザインパターンでいうところのSingletonという構造になっていまして、そのクラスを使用する際にインスタンスを複数生成するのを防止する役目をします。(複数のクラス間で1つのインスタンスを使うというのが本来の意味。)

>・それでいてクラスメソッドではない(?)所
publicじゃないと他のクラスから参照できませんよね。

使用する理由としては同じクラスを複数インスタンス生成し、利用するとメモリの使用量が増えていくのを抑えるというがあります。

参考URL:http://www.tech-arts.co.jp/oo/pattern.html#Singleton

投稿日時 - 2003-04-15 15:23:41

お礼

どうもありがとうございます。

投稿日時 - 2003-04-15 18:44:42

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

Calendarクラスの場合のgetInstance()は、
純粋なSingletonでは無いみたいですね。
オブジェクトの生成が制限されているわけではないようだから。

CalendarのgetInstance()の意味は、#2さんの理由と、
デフォルトのCalendarオブジェクトを返す
(どこの国で使われるかわからないので、現地のロケールに合ったオブジェクトを提供する)目的があるでしょう。

で、問題のコードですが、想像するに、
「オブジェクトが一つだけの時はSingletonパターンを使うんだよ」とたまたま聞いて、
『デザインパターン』(ソフトバンク刊)なんか見ながら見よう見まねで書いてみた、
というところではないでしょうか。

投稿日時 - 2003-04-15 17:05:21

お礼

先人が置いていったマニュアルのひとつに、ソフトバンクのデザインパターン入門がありまして、その本にしおりがはさまっていました。そのページとはSingletonの章でした。ちょっと、笑えました。どうもありがとうございました。

投稿日時 - 2003-04-15 18:48:19

ANo.2

質問中に記述されているmethodA()はクラスメソッドです。
ですので、これだけでは、Singletonパターンが使われている
理由はよく分かりません。
ちなみに、Calendarは抽象クラスですので、getInstance()が
返すインスタンスは、常にその拡張クラスのものになります。

投稿日時 - 2003-04-15 15:33:10

お礼

どうもありがとうございました。

投稿日時 - 2003-04-15 18:45:27

あなたにオススメの質問