2012-09-22 4 views
5

Es gibt ein ziemlich cooles Konzept von Ticker in Guava. Leider scheint es, als ob es um das Erzeugen von fokussierten Stoppuhren im Nanosekundenbereich zum Messen von Ausführungsdauern entwickelt wurde.Proxy-Objekt zum Erhalten der Systemzeit

Ich würde gerne etwas wie diese zu verwenden, weil es Testklassen für Zeitänderungen empfindlicher macht. Ich habe ein Problem historisch gesehen, als ich System.currentTimeMillis() verwendete, weil es schwer ist, den Ablauf der Zeit in einem Test zu simulieren. Ich dachte daran, eine ähnliche Schnittstelle zu verwenden, wie Guava, aber Messzeiten in Millis statt, weil das mehr der verfügbaren Bibliotheken entspricht.

Ich wollte fragen, ob jemand etwas ähnliches gesehen hat oder andere Vorschläge hat, bevor ich es selbst schreibe.

+2

Warten. Sie möchten ein "Ticker", außer Messzeiten in Millisekunden? Gibt es einen besonderen Grund, dass die Konvertierung von Nanosekunden ein Problem ist? –

+2

@NickCampion: Es ist keine schlechte Frage. Siehe meine Antwort. – ColinD

Antwort

4

Das ist, was ich in meinen Projekten verwenden:

public interface Clock { 
    LocalDate today(); 
    LocalTime time(); 
    LocalDateTime now(); 
    long timestamp(); 
} 

Wie Sie sagten, es Unit-Tests viel einfacher (oder sogar möglich) macht. Ich habe eine Implementierung, die immer die wahre Zeit zurückgibt und eine FakeClock, die ich steuern kann. Die Implementierungen sind so einfach, dass Sie leicht Ihre eigenen rollen können - ich glaube nicht, dass es so etwas in Guava gibt. Dieser Ansatz wird auch in Growing Object-Oriented Software, Guided by Tests beschrieben und empfohlen.

+0

Danke für die Idee und für die Buchreferenz, sehen Sie interessant aus. –

0

Edit: Nach weiterem Nachdenken mag ich den Vorschlag von Christoph und Colin. Die Idee einer ähnlichen Funktionalität für die Wanduhr wäre schön.

Wie bereits erwähnt, ist die beste Strategie hier wahrscheinlich nur eine Methode zu implementieren, die eine Millisekunde Zeit außerhalb des Tickers liest.

5

Wie Sie weisen darauf hin, Ticker ist zur Messung Zeit verstrichen ist (was System.nanoTime() für ist), nicht die Uhrzeit Wand (was System.currentTimeMillis() ist) und man sollte es nicht zu bekommen, dass verwenden.

Ich würde vorschlagen, eine abstrakte Clock Klasse zu erstellen, die wie Ticker ist, aber für Wanduhrzeit in Millis bekommen.

+0

Danke für die Rückmeldung Colin. Ich werde Christoph die "Antwort" nennen, obwohl ihr dasselbe sagt, weil ich die genaue Uhr benutzt habe, die er definiert hat. Wenn ich 2 Antworten markieren könnte, würdest du # 2 sein :) Leider habe ich mich auch dafür entschieden, joda-time zu verwenden, damit meine Uhr keinen Sinn macht, sich wieder auf Guave zu begeben. Das ist schade. –

Verwandte Themen