1

これは試験の過去問からの問題です。私は質問を完了し、それは動作します。ただし、実装が弱い可能性があると感じています。たとえば、グレゴリオ クラス全体で static を使用しています。

それぞれのシナリオを考慮して、(グレゴリオ語のクラスで)適切と思われる方法で書くための3つの方法が与えられました。Gregorian クラスの 3 つのメソッドで static を使用したのは正しかったでしょうか。

また、日、月、年のフィールドは不変であることを意図していますが、それらを非公開として設定していますか? (一度作成すると、フィールド値は変更できません)

public class Date {

private int day;// needs to be immutable?
private String month;// needs to be immutable?
private int year;// needs to be immutable?

public Date(int theDay, String theMonth, int theYear) {
    this.day = theDay;
    this.month = theMonth;
    this.year = theYear;
}

public int getDay() {
    return day;
}

public String getMonth() {
    return month;
}

public int getYear() {
    return year;
}

}

public class Gregorian {

public static Date d;

public static boolean leapYear(){

    if(d.getYear() %400==0 || (d.getYear()%4==0 && d.getYear()%100!=0)){
        return true;
    }else{
        return false;
    }
}

public static int getGregorianDateNumber(){
    int a = (d.getYear()*384)*(32+d.getDay());
    return a;
}

public static int getISO8601Date(){
    int b = (d.getYear()*367)+d.getDay();
    return b;
}

public static void main (String[] args){
    d = new Date(9, "June", 8);
    System.out.println(getGregorianDateNumber());
    System.out.println(getISO8601Date());
    System.out.println(leapYear());
}

}

4

4 に答える 4

2

静的メソッドと静的フィールドの代わりに、dそれらをすべて非静的にします。

public class Gregorian {
    private final Date d;

    public Gregorian(Date d_) {
        this.d = d_;
    }

    public boolean isLeapyear() {
        ... // implemented as above
    }

    ... // Other methods as above, but all non-static.
}

そして主に次のとおりです。

public static void main (String[] args){
    Date d = new Date(9, "June", 8);
    Gregorian g = new Gregorian(d);
    System.out.println(g.getGregorianDateNumber());
    System.out.println(g.getISO8601Date());
    System.out.println(g.leapYear());
}
于 2012-08-23T16:24:34.033 に答える
1

dayとの両方がプリミティブであり、利用可能yearな の不変バージョンが既にあり、それを利用できます。intInteger

Date2 つ目は、 inへの静的参照ではなく、引数として各メソッドGregorianに渡すことです。これで、スレッドの安全性を確保できます。Datestatic

于 2012-08-23T15:28:58.873 に答える
1

thinksteepに同意します-フィールドに「最終」を追加すると、フィールドが変更されないようにするのに役立ちます。セッターがいないと、これが強化されます。

さらに、指摘したいのは、

private String month;// needs to be immutable?

「January」から「Pie」まで、何でも作成できます。私が提案する場合は、それを列挙型に変更し、月の許容値を設定してください。

public enum MonthName {
    JAN,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC;
}

Date クラスを次のように変更します。

private final int day;
private final MonthName month;
private final int year;

public Date(int theDay, MonthName theMonth, int theYear) {
    this.day = theDay;
    this.month = theMonth;
    this.year = theYear;
}
于 2012-08-23T15:17:29.120 に答える
1

文字列はデフォルトで不変です。

private int day;// needs to be immutable?
private int year;// needs to

定義した不変フィールドではありません。それらの状態は変化する可能性があります。それらを最終的にします。

注:参照を最終的にしても、オブジェクトの状態を変更できないわけではありません(あなたの場合、オブジェクトを参照していないため、このメモは関係ありません)。

于 2012-08-23T15:03:14.517 に答える