
[code]

    Date d = new Date();
    Calendar c = Calendar.getInstance();
    
[/code]

上記はどちらとも、インスタンスを生成していますが、片方にはnewが付いていて、もう一方には付いていません。  
これを判断するには一つ一つのクラスの使い方を知るしかないのでしょうか？  
詳しい方、ご教示ください。よろしくお願いいたします。


CC BY-SA 3.0
2015-05-09T13:03:04.487
9987
2015-05-11T02:45:34.920
2015-05-11T01:27:35.543
49
8619
question
java
javaのインスタンスの生成に関して


リファレンスを見て各クラスの使い方を知るしかないというのはその通りですが、[デザインパターン](http://ja.wikipedia.org/wiki/%E3%83%87%E3%82%B6%E3%82%A4%E3%83%B3%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3_%28%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%29)にのっとって設計されているのでパターンを把握していれば理解できるかと思います。

たとえば`Calendar`クラスは`abstract`でインスタンスを`new
Calendar()`と作成することができません。実際に使用するのは派生型の`GregorianCalendar`で、`Calendar.getInstance()`では実行環境に応じたインスタンスが返されます。これはFactory
Methodというデザインパターンです。

一方`Date`は単なる値オブジェクトですので、あえて派生型のインスタンスを作成する必要は低いです。


CC BY-SA 3.0
2015-05-09T13:34:35.363
9988
2015-05-09T13:34:35.363
5750
9987
answer


Date
はイミュータブルであるのに対して、Calendarはそうではありません。今の日付から3日足して2時間足して35分足して...といった操作をイミュータブルなオブジェクトで実装すると多くの無駄なインスタンスが必要になりますよね。Calendarは自己を変更可能なのでそういった心配がありません。またロケールを新たに追加変更する際に、実装を隠ぺいする事が出来ます。


CC BY-SA 3.0
2015-05-11T02:45:34.920
10020
2015-05-11T02:45:34.920
440
9987
answer