我收到一個錯誤,說「無法實例化類型時鐘」,我不知道爲什麼。我不知道爲什麼我只是通過創建一個新的時鐘對象來得到一個錯誤
import java.time.Clock;
public class TS1 {
public long getTime(){
Clock c = new **Clock**(); //Error occurs here for bold Clock
return c.millis();
}
}
我收到一個錯誤,說「無法實例化類型時鐘」,我不知道爲什麼。我不知道爲什麼我只是通過創建一個新的時鐘對象來得到一個錯誤
import java.time.Clock;
public class TS1 {
public long getTime(){
Clock c = new **Clock**(); //Error occurs here for bold Clock
return c.millis();
}
}
引述javadoc of class Clock(在Java 8加):
這種抽象的主要目的是允許備用時鐘需要如,當在被插入。應用程序使用對象來獲取當前時間而不是靜態方法。這可以簡化測試。
要使用抽象類Clock
的millis()
方法,你不必把它擴大,可以在java.time包中使用給定的實現。例如,你可以聲明下面的方法:
import java.time.Clock;
public class App {
public static long getMillis(Clock clock){
return clock.millis();
}
}
在你,你應用程式,你可以得到一個系統時鐘實現,而採用直接和靜態調用到System.currentTimeInMillis()
:
Clock systemClock = Clock.systemUTC();
System.out.println(getMillis(systemClock));
這個應用程序代碼依賴在操作系統時鐘上,它的結果在每個運行時間之間變化。
在你的測試代碼,你可以用一個固定的時鐘實例,因此結果是確定的和可預見的,無論測試時間(當然,對於很多測試場景,你會使用一個模擬對象):
import static org.junit.Assert.*;
import org.junit.Test;
import java.time.Clock;
import java.time.Instant;
import java.time.ZoneOffset;
@Test public void checkSampleUTCTime(){
Clock fixedClock = Clock.fixed(Instant.parse("2016-04-21T11:54:20.00Z"), ZoneOffset.UTC);
assertEquals(1461239660000L,App.getMillis(fixedClock));
}
此外,有些人會說,喬達時間DateTimeUtils
類(see javadoc)是更好的選擇 - 因爲您可以使用setCurrentMillisFixed()
和setCurrentMillisSystem()
來替代系統時鐘行爲,而不是java.time.Clock
依賴注入。
你看過時鐘的javadoc嗎?構造函數受保護:僅適用於子類。 –
那麼我該如何解決它?也只是延長時鐘班迫使我添加一堆我不想要的絨毛。 – Heiland
再次,閱讀javadoc。時鐘有幾種靜態方法可以創建幾種時鐘。 –