2016-04-16 10 views
-1

「タイプクロックをインスタンス化できません」というエラーが表示され、その理由がわかりません。新しいClockオブジェクトを作成するだけでエラーが発生する理由がわかりません

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

(ジャワ8で追加)javadoc of class Clock引用:

この抽象化の主な目的は、代替クロックが必要等の場合にプラグインできるようにすることです。アプリケーションは、静的メソッドではなく現在の時刻を取得するためにオブジェクトを使用します。これにより、テストが簡単になります。

抽象Clockクラスのmillis()メソッドを使用するには、あなたがjava.timeパッケージに与えられた実装を使用することができ、それを拡張する必要はありません。たとえば、次のメソッドを宣言することができます

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

をあなたにあなたがSystem.currentTimeInMillis()に直接および静的呼び出しを使用して、むしろ、システムクロックの実装を取得することができAPP:

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依存性注入の代わりにシステムクロック動作を交互に使用できるため、より良い選択肢となります。

関連する問題