2016-04-16 14 views
-1

我收到一個錯誤,說「無法實例化類型時鐘」,我不知道爲什麼。我不知道爲什麼我只是通過創建一個新的時鐘對象來得到一個錯誤

import java.time.Clock; 
public class TS1 { 

    public long getTime(){ 
     Clock c = new **Clock**(); //Error occurs here for bold Clock 
     return c.millis(); 
    } 
} 
+1

你看過時鐘的javadoc嗎?構造函數受保護:僅適用於子類。 –

+0

那麼我該如何解決它?也只是延長時鐘班迫使我添加一堆我不想要的絨毛。 – Heiland

+0

再次,閱讀javadoc。時鐘有幾種靜態方法可以創建幾種時鐘。 –

回答

0

引述javadoc of class Clock(在Java 8加):

這種抽象的主要目的是允許備用時鐘需要如,當在被插入。應用程序使用對象來獲取當前時間而不是靜態方法。這可以簡化測試。

要使用抽象類Clockmillis()方法,你不必把它擴大,可以在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依賴注入。

相關問題