2012-09-26 60 views
1

爲我的應用程序創建一個「假時間」或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); 
} 

所以即時問一個小小的建議,或有關同步的知識,以及天氣或不是我應該用我的方法。

最好的問候 - 馬丁。

+0

您可能想要重新考慮此類的某些設計 - 通過返回實際存儲的Date實例作爲狀態,可以讓其他代碼執行類似於「DateTime」的操作。 getCurrentTime().setTime(...)' –

+0

@mattb好點,感謝您的輸入 –

+1

實際上有一個關於單身模式的渴望初始化的評論(不知道爲什麼它被刪除) - 這個人是正確的我猜,因爲它使類是線程安全的 - 因此不需要同步任何東西。 所以我想這就是我要做什麼,而不是做同步或不穩定的東西。 –

回答

2

我將只有一個線程更新時間,並使字段volatile如果需要。

我不會以可變的方式使用Date,我會使用long

+0

關於日期與長期問題,你的意思是與上面評論中的mattb相同嗎?我應該只是抓取返回Date對象的方法嗎?在此先感謝 –

+0

我會,是的... –

+0

謝謝一堆。我使用的單例模式的急切初始化清除了線程安全問題。所以我想現在它的一切都很好:) 再次感謝! –

相關問題