【问题标题】:I don't know why I'm getting an error simply by creating a new Clock object我不知道为什么仅仅通过创建一个新的时钟对象就会出错
【发布时间】:2016-08-08 18:05:00
【问题描述】:

我收到一条错误消息“无法实例化时钟类型”,我不知道为什么。

import java.time.Clock;
public class TS1 {

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

【问题讨论】:

  • 您查看了 Clock 的 javadoc 吗?构造函数受保护:仅对子类可用。
  • 那我该如何解决呢?也只是扩展时钟类迫使我添加一堆我不想要的绒毛。
  • 再次阅读 javadoc。 Clock 有几个静态方法允许创建多种时钟。
  • 可以参考this的例子。

标签: java time clock


【解决方案1】:

引用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));
}

另外,有人会说 joda time DateTimeUtils class (see javadoc) 是更好的选择 - 因为您可以使用 setCurrentMillisFixed()setCurrentMillisSystem() 来交替系统时钟行为,而不是 java.time.Clock 依赖注入。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 2022-11-20
    • 2022-01-15
    • 1970-01-01
    • 2019-08-24
    相关资源
    最近更新 更多