爲我的應用程序創建一個「假時間」或TimeSource,關鍵是這個新類應該控制應用程序的實際時間。這意味着所有使用Date()構造函數,System.currentTimeInMillis()或Calendar.getInstance()的方法都應該使用我的類(例如TimeSource.getInstance.getCurrentTimeInMillis())。我應該同步我的「假時間」類方法嗎?
這樣我就可以在測試環境中操縱系統的實際時間。
但我不知道我是否應該同步這些方法,或者我應該如何去做。
我可以告訴你下面的代碼:
public class DateTime {
private static final long ONE_MINUTE = 60 * 1000;
private static final long ONE_HOUR = ONE_MINUTE * 60;
private static final long ONE_DAY = ONE_HOUR * 24;
private static final long ONE_MONTH = ONE_DAY * 30;
private static final long ONE_YEAR = ONE_DAY * 364;
private static DateTime instance;
private Date date;
private Date staticDate;
private boolean isStatic = false;
private long addedTimeInMilliseconds = 0;
public static DateTime getInstance() {
if (instance == null) {
instance = new DateTime();
}
return instance;
}
private DateTime() {
date = new Date(System.currentTimeMillis());
staticDate = new Date(System.currentTimeMillis());
}
public Date getCurrentTime() {
if (isStatic) {
return staticDate;
} else {
date.setTime(System.currentTimeMillis()+this.addedTimeInMilliseconds);
return date;
}
}
public long getCurrentTimeInMillis() {
if (isStatic) {
return staticDate.getTime();
} else {
return System.currentTimeMillis()+this.addedTimeInMilliseconds;
}
}
}
伊夫在方法上運行一些測試 - 單和多線程的測試 - 與syncronized方法的性能是很多比沒有同步惡化。問題是我不確定這些方法是否會在將來發生問題,如果我不同步它們。
我還使用了一些方法來添加到「當前應用程序的時間」
public void addMinutesToDateTime(int minutes) {
this.addedTimeInMilliseconds += (minutes * ONE_MINUTE);
}
所以即時問一個小小的建議,或有關同步的知識,以及天氣或不是我應該用我的方法。
最好的問候 - 馬丁。
您可能想要重新考慮此類的某些設計 - 通過返回實際存儲的Date實例作爲狀態,可以讓其他代碼執行類似於「DateTime」的操作。 getCurrentTime().setTime(...)' –
@mattb好點,感謝您的輸入 –
實際上有一個關於單身模式的渴望初始化的評論(不知道爲什麼它被刪除) - 這個人是正確的我猜,因爲它使類是線程安全的 - 因此不需要同步任何東西。 所以我想這就是我要做什麼,而不是做同步或不穩定的東西。 –