2016-10-07 2 views
1

さて、新しいAndroid開発者として、配列を使用してフィールドを格納し、インデックス名を示す整数定数を作成するのは(これまで)Calendarクラスだけでした。たとえば、次のようになぜJava Calendarはフィールドを汎用フィールドではなく配列に格納するのですか?

public class Calendar{ 
    ... 
    public static final int ERA = 0; 
    public static final int YEAR = 1; 
    public static final int MONTH = 2; 
    protected int[] fields = null; 
    ... 
} 

そして、あなたが取得したい場合、例えば、カレンダーの年:

int year = Calendar.getInstance().get(Calendar.YEAR); 

は、この種の設計の目的は何ですか?その背後にある理由は何

int year = Calendar.getInstance().getYear(); 

:通常のgetterメソッドと

public class Calendar{ 
    ... 
    protected int year; 
    ... 
    public int getYear() { return year; } 
} 

とアクセスそれ:私はなぜのようなものを使用しない、意味ですか?

+0

Javaがフィールドを反復処理しているかどうかを確認したい場合があります。私の心に来る理由だけ。 – user5055454

+1

フィールドごとに1つではなく、メソッドを1つだけ取得します。 – user5055454

+0

私の答えはあなたを助けましたか? – xenteros

答えて

3

単にSOLID,Open-Closeと厳密になります。 SOLID

オラクルのある誰かが、Calendarにナノ秒を追加することを想像します。 fieldsに1つのセルを追加するだけで簡単になり、NANOSECONDSという1つのフィールドが追加されます。それは単なる良いデザインです。

すべてのフィールドでループを変更する必要はありません。反射の必要はありません。

また、WET(We Enjoy Typing)ではなく、DRY(自分自身を繰り返してはいけません)です。なぜゲッターとセッターのすべてをタイプするのですか?それはコードを混乱させ、それを読みにくくするでしょう。 ditとしてDRY

が指摘:

add方法を設計するときそれはまた有用でした。今度は、{addYear, addMonth etc.}から適切なメソッドを使用する代わりに、追加するフィールドと値だけを指定します。 Waste Everyones Timeの点ではWETとなるでしょう。

今、あなたは簡単に使用することができます。

cal.add(Calendar.YEAR, 1); 

次のいずれかに年を変更しますました。

+0

https://en.m.wikipedia.org/wiki/SOLID_(object-oriented_design) - ソリッドの家族ではない人のために。 – MordechayS

+0

@MordechayS悪い彼ら... – xenteros

+0

うわー、それは狂った賢いです。私はなぜ大学の誰もそれを教えてくれないのだろうかと思う。 –

0

日付を変更することも簡単です。例えばフィールドをインクリメント:

Calendar c = Calendar.getInstance(); 
c.add(Calendar.YEAR, 1); // one year later 
c.add(Calendar.DATE, 1); // tomorrow 

たちはxenterosによって記述されたソフトウェアの設計せずに何をすべきかを想像してみてください。

関連する問題