• ベストアンサー

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

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でインスタンスを作り出さない所 ・それでいてクラスメソッドではない(?)所 この辺りについてご回答よろしくお願いします。

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

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

getInstance()メソッドについてですが、 >・クラスの外でnewでインスタンスを作り出さない所 デザインパターンでいうところのSingletonという構造になっていまして、そのクラスを使用する際にインスタンスを複数生成するのを防止する役目をします。(複数のクラス間で1つのインスタンスを使うというのが本来の意味。) >・それでいてクラスメソッドではない(?)所 publicじゃないと他のクラスから参照できませんよね。 使用する理由としては同じクラスを複数インスタンス生成し、利用するとメモリの使用量が増えていくのを抑えるというがあります。

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

お礼

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

その他の回答 (2)

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.3

Calendarクラスの場合のgetInstance()は、 純粋なSingletonでは無いみたいですね。 オブジェクトの生成が制限されているわけではないようだから。 CalendarのgetInstance()の意味は、#2さんの理由と、 デフォルトのCalendarオブジェクトを返す (どこの国で使われるかわからないので、現地のロケールに合ったオブジェクトを提供する)目的があるでしょう。 で、問題のコードですが、想像するに、 「オブジェクトが一つだけの時はSingletonパターンを使うんだよ」とたまたま聞いて、 『デザインパターン』(ソフトバンク刊)なんか見ながら見よう見まねで書いてみた、 というところではないでしょうか。

Vargas
質問者

お礼

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

  • ranx
  • ベストアンサー率24% (357/1463)
回答No.2

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

Vargas
質問者

お礼

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

関連するQ&A