簡體   English   中英

我不知道為什么我只是通過創建一個新的 Clock 對象來得到一個錯誤

[英]I don't know why I'm getting an error simply by creating a new Clock object

我收到一條錯誤消息,指出“無法實例化時鍾類型”,但我不知道為什么。

import java.time.Clock;
public class TS1 {

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

引用 類時鍾javadoc (在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));
}

此外,有些人會說 joda time DateTimeUtils類( 請參閱 javadoc )是更好的選擇 - 因為您可以使用setCurrentMillisFixed()setCurrentMillisSystem()來替代系統時鍾行為,而不是java.time.Clock依賴注入。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM