2016-04-13 7 views
0

をオーバーロード:コンストラクタは、これが私のクラスである

public class DateTime { 

private int hours; 
private int minutes; 
private int seconds; 
private int day; 
private int month; 
private int year; 



public DateTime(int hours, int minutes, int seconds) { 


    Calendar c = Calendar.getInstance(); 
    int day = c.get(Calendar.DAY_OF_MONTH); 
    int month = c.get(Calendar.MONTH); 
    int year = c.get(Calendar.YEAR); 

    this(hours,minutes,seconds,day,month,year); //Error: call to this must be first statement in constructor java 

} 


public DateTime(int hours, int minutes, int seconds, int day, int month, int year) { 

    this.hours = hours; 
    this.minutes = minutes; 
    this.seconds = seconds; 
    this.day = day; 
    this.month = month; 
    this.year = year; 
} 
} 

私は、このロジックを
をコンストラクタをオーバーロードしたいしかし、私は取得エラー:
「コンストラクタのJavaの最初のステートメントでなければなりませんこれに呼んで」、
解決策をお聞かせください。

+0

'この()'最初に

public DateTime(int hours, int minutes, int seconds, int day, int month, int year) { this(hours, minutes, seconds); this.day = day; this.month = month; this.year = year; } 

4)代理人)を2回設定すると '日あなたを設定します'、'月 '、'年 ' – 0xDEADC0DE

答えて

1

いくつかのソリューション...

0がある)は、コンストラクタの呼び出しをインライン化し、直接時間分、秒を設定し、それがトラブル

1価値はありません)

public DateTime(int hours, int minutes, int seconds) { 
    this(hours, minutes, seconds, Calendar.getInstance()); 
} 
private DateTime(int hours, int minutes, int seconds, Calendar c) { 
    this(hours,minutes,seconds,c.get(Calendar.DAY_OF_MONTH),c.get(Calendar.MONTH),c.get(Calendar.YEAR)); 
} 
仲介コンストラクタを使用します

2)コンストラクタの代わりにファクトリメソッドを使用する

public static DateTime newDateTime(int hours, int minutes, int seconds) { 
    Calendar c = Calendar.getInstance(); 
    int day = c.get(Calendar.DAY_OF_MONTH); 
    int month = c.get(Calendar.MONTH); 
    int year = c.get(Calendar.YEAR); 
    return new DateTime(hours,minutes,seconds,day,month,year); 
} 

3)依存関係を反転(日月年は方法の代わりに、コンストラクタあなたが簡単に呼び出すことができます

public DateTime(int hours, int minutes, int seconds) { 
    Calendar c = Calendar.getInstance(); 
    int day = c.get(Calendar.DAY_OF_MONTH); 
    int month = c.get(Calendar.MONTH); 
    int year = c.get(Calendar.YEAR); 
    set(hours,minutes,seconds,day,month,year); 
} 
public DateTime(int hours, int minutes, int seconds, int day, int month, int year) { 
    set(hours,minutes,seconds,day,month,year); 
} 
private final void set(int hours, int minutes, int seconds, int day, int month, int year) { ... } 
1

'this()'はコンストラクタによって呼び出される最初のものである必要があります。それでは解決策があります。次のように使用できます:

public class DateTime { 

private int hours; 
private int minutes; 
private int seconds; 
private int day; 
private int month; 
private int year; 



public DateTime(int hours, int minutes, int seconds) { 

Calendar c = Calendar.getInstance(); 
this.day = c.get(Calendar.DAY_OF_MONTH); 
this.month = c.get(Calendar.MONTH); 
this.year = c.get(Calendar.YEAR); 
this.hours = hours; 
this.minutes = minutes; 
this.seconds = seconds; 

} 
} 

これはうまくいくと思います。

関連する問題