• ベストアンサー

二段階でインスタンス化する必要、メリットって何?

JAVAについての質問です。 オブジェクトを宣言しても、NEWしない(インスタンス化しない)とメモリにはその領域が確保されないと参考書には 書かれていますが、このようにわざわざ二段階にわけてインスタンス化する必要、メリットって一体何なんでしょうか。 確かにインスタンス化されるまでは、メモリの節約にはなるでしょうが、宣言とインスタンス化する時間的なズレは わずかなもので、増してPCにとっては、もっと大した時間ではないでしょう。 それほどまでにしても、メモリの節約が大事なのでしょうか。 このように二段階にする意味は他に何か理由はあるような気がして仕方ないのですが。 このような疑問を持つのは私だけでしょうか。

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

  • ベストアンサー
  • mibusys
  • ベストアンサー率60% (18/30)
回答No.3

Calendarクラスは(基本的には)自分でnewできません。 どのように使うかというと Calendar c = Calendar.getInstance(); と書きます。 これはデザインパターンのシングルトンパターンというのですが 「今の日付のオブジェクト」を使いたい場合はよくあるわけです。 その際に使う場所ごとに別のオブジェクトを新規作成していたら 領域が無駄に使われますよね。なので、1つのVM上で動いている間は 同じオブジェクトを再利用するためにそのような仕組みを使います。 この辺はJavaを1年くらい勉強したあとによりよいコードを書くために 勉強すべき点なので少し難しいかもしれません。 また、ある変数に具体的にどんなクラスのオブジェクトを格納するのか 決まっていない場合もあります。極端な話 Object o; としておけば、StringでもDateでもどんなオブジェクトでも入れられます。 最近の流行はSpringなどのフレームワークでabstractとかのクラスを 受け側にして実体化するオブジェクトはそれを継承した実装クラスを使用し どの実装クラスを使うかはXMLに記述し実行時にDIするという方法です。 つまり「車」クラスを受け皿にし、その実体に「ベンツ」オブジェクトを入れるか 「トヨタ車」オブジェクトを入れるかは決まってないし、Javaのソース上にすら 書かないこともあるよということです。これは少し難しいかもしれませんが。 まぁとにかく大人の事情で毎回newするわけじゃないよ違う場合もあるよ ということです。

その他の回答 (2)

  • spieder
  • ベストアンサー率59% (13/22)
回答No.2

メモリやCPUを節約するためになぜオブジェクトの宣言とインスタンス化を分けるのかという意味なら、そのオブジェクトを使うか使わないか、プログラムの記述時には判らないから、必要な場合だけインスタンス化してメモリとCPU時間を節約します。そうすることで、普通のディスクトップアプリだと起動時間やレスポンスの向上、サーバーアプリなら同時処理能力の向上が見込めます。 たとえば、アプリケーションの一部の機能として画像のサムネイル一覧表示をする場合、起動時にPCの中のすべての画像に対してサムネイル画像を作成するのは無駄です。表示する1つのディレクトリ分のサムネイル表示する場合でも、画面のサイズ的にサムネイルが全て収まらない場合、表示しないサムネイルを作成しないほうが早く処理ができます。特に処理する数が多くなればなるほど効果が出てきます。 "遅延初期化"という単語で検索すればいろいろ情報は出てきますよ 単純に"オブジェクトの宣言とインスタンス化を別に記述する必要があるのか?"なら、宣言したオブジェクトに対して必ず新しいインスタンスを生成する必要が無いからというのが答えです。メソッドを呼び出した結果を宣言したオブジェクトに代入して後の処理で同じインスタンスを使うためです。 (Javaは同じインスタンスのメソッド呼び出し結果が、必ず同じインスタンスを返すことは言語仕様上保障されていない Ex Iterator.next)

参考URL:
http://www.sgnet.co.jp/java/chapter0302.html
htgo
質問者

お礼

spiederさん、有難うございます。 >宣言したオブジェクトに対して必ず新しいインスタンスを生成する必要が無いからというのが答えです。メソッドを呼び出した結果を宣言したオブジェクトに代入して後の処理で同じインスタンスを使うためです。 ⇒新しいインスタンスを生成する必要が無いのなら、オブジェクトを宣言する必要が無いと思うのですが。

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.1

変数宣言とインスタンス化は全く別の作業だから 別々になっているだけです。 変数宣言したら必ずnewするわけでもないですし。 例えば、既に作成済みのインスタンスを代入したり、 インスタンスを返すメソッドの返り値を代入したりすることもあるでしょ?

関連するQ&A