2013-09-08 4 views

risposta

4

Il tempo può essere rappresentato in vari modi a seconda delle esigenze. Personalmente ho utilizzato:

  1. Long - un sacco di strumenti prendere direttamente
  2. Aggiornato: java.time.* grazie alla @Vladimir Matveev

    Il pacchetto è stato progettato dall'autore di Joda Time (Stephen Colebourne). He says è progettato meglio.

  3. Joda Time

  4. java.util.Date

  5. gerarchia separata di classi:

    trait Time 
    case class ExactTime(timeMs:Long) extends Time 
    case object Now extends Time 
    case object ASAP extends Time 
    case class RelativeTime(origin:Time, deltaMs:Long) extends Time 
    
  6. rappresentazione tempo ordinato:

    case class History[T](events:List[T]) 
    
  7. Ora modello. Una volta ho avuto un oggetto globale Timer con var currentTime:Long:

    object Timer { 
        private var currentTimeValue:Long 
        def currentTimeMs = currentTimeValue 
        def currentTimeMs_=(newTime:Long) { ... some checks and notifications} 
        def pseudoRandom:Double = ... 
    } 
    

    E ovunque nel programma ho chiamato Timer.currentTimeMs per ottenere il tempo. Permette di scrivere test deterministici con time shift controllato. (Attenzione variabile globale! Ora io preferisco usare istanze separate di Timer per evitare problemi di concorrenza.)

+2

Metterei Joda Time nella prima posizione nell'elenco. E non è 'java.util.Date' che è utilizzabile in Java 8, è' java.time. * 'Pacchetti. –

+0

C'è anche il tempo di utilizzo di Twitter, ma mi sto ancora chiedendo quando dovresti usare l'uno o l'altro. – Mortimer

4

Credo di essere in parte responsabile di questo.

Il problema generale qui è che il sistema del tempo è difficile. Davvero, davvero, davvero difficile.

Gli sviluppatori di Akka che hanno lavorato alla standardizzazione di Futures necessitavano di un costrutto per descrivere la lunghezza tra due punti "anonimi" nel tempo per implementare la loro funzionalità. Duration è stato costruito per risolvere questo specifico requisito.

La mia preoccupazione era che la gente potrebbe iniziare a utilizzare questa classe in funzione del tempo per le cose non è stato progettato per averci portato in una situazione problematica paragonabile a java.util.Date/java.util.Calendar (non del tutto, perché Duration effettivamente funziona per il suo utilizzo e minuscole), dove Un sacco di persone l'avrebbero usato impropriamente come una specie di scala.time che non avrebbe mai dovuto essere.

Ecco perché ha questa nota ed è impacchettato in scala.concurrent.duration invece di e. g. scala.time.

Aspetto con impazienza la spedizione del pacchetto java.time con Java 8. Potrebbe essere possibile standardizzarlo in futuro, il che migliorerebbe un po 'l'interoperabilità e avrebbe l'ulteriore vantaggio di essere progettato per un caso d'uso molto più ampio. (Probabilmente ci vorrà molto tempo prima che Scala usi Java 8 come base, sebbene ...)

+0

Grazie per la risposta, mi sto ancora chiedendo se ci sono esempi concreti di cosa non dovresti * fare * con Durata? – Mortimer