2016-04-16 10 views
-1

Ich erhalte einen Fehler, der besagt "Kann den Typ Clock nicht instanziieren" und ich weiß nicht warum.Ich weiß nicht, warum ich einen Fehler erhalte, indem ich einfach ein neues Clock-Objekt erstelle

import java.time.Clock; 
public class TS1 { 

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

Haben Sie sich das Javadoc für Clock angesehen? Der Konstruktor ist geschützt: Nur für untergeordnete Klassen verfügbar. –

+0

Also, wie repariere ich es? Auch wenn ich nur die Uhrklasse verlängere, zwinge ich mich dazu, einen Haufen Flusen hinzuzufügen, die ich nicht haben will. – Heiland

+0

Lesen Sie erneut das Javadoc. Clock verfügt über mehrere statische Methoden, mit denen verschiedene Arten von Clocks erstellt werden können. –

Antwort

0

unter Angabe der javadoc of class Clock (hinzugefügt in Java-8):

Der primäre Zweck dieser Abstraktion abwechselnde Takten so eingesteckt werden, damit ist, und, wenn erforderlich. Anwendungen verwenden ein Objekt, um die aktuelle Zeit statt einer statischen Methode zu erhalten. Dies kann das Testen vereinfachen.

Um die millis() Methode der abstrakten Clock Klasse zu verwenden, müssen Sie es nicht verlängern, Sie gegeben Implementierungen in java.time Paket verwenden können.

import java.time.Clock; 
public class App { 
    public static long getMillis(Clock clock){ 
     return clock.millis();   
    } 
} 

In Ihrem Sie App können Sie eine Systemuhr Implementierung zu bekommen, sondern eine direkte und statische Berufung System.currentTimeInMillis() mit: Zum Beispiel können Sie die folgende Methode deklarieren

Clock systemClock = Clock.systemUTC(); 
System.out.println(getMillis(systemClock)); 

Diese App Code hängt auf dem Betriebssystemtakt und es Ergebnis variiert zwischen jeder Laufzeit.

In Ihrem Testcode können Sie einen festen Takt Beispiel verwenden, so dass die Ergebnisse sind deterministisch und vorhersehbar, unabhängig von der Testzeit (Sicherlich für viele Testszenarien würden Sie ein Mock-Objekt verwenden):

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

Außerdem würden einige sagen, dass joda Zeit DateTimeUtils Klasse (see javadoc) schönere Option ist - da Sie setCurrentMillisFixed() und setCurrentMillisSystem() abzuwechseln die Systemuhr Verhalten, statt java.time.Clock Dependency Injection verwenden können.

Verwandte Themen