2013-09-08 65 views
8

Tôi đã đọc scala doc for the scala.concurrent.duration.Duration class, và tôi chỉ phát hiện ra rằng nó bắt đầu với:scala Thời lượng: "Lớp này không có nghĩa là đại diện cho mục đích chung của thời gian, nó được tối ưu hóa cho các nhu cầu của scala.concurrent."

Lớp này không có nghĩa là như một đại diện mục đích chung của thời gian, nó được tối ưu hóa cho nhu cầu của scala.concurrent.

Tại sao các tác động của tuyên bố này? Một lựa chọn tốt hơn là gì?

Trả lời

4

Thời gian có thể được trình bày theo nhiều cách khác nhau tùy theo nhu cầu của bạn. Cá nhân tôi đã sử dụng:

  1. Long - rất nhiều các công cụ mang nó trực tiếp
  2. Cập nhật: java.time.* nhờ @Vladimir Matveev

    Các gói phần mềm được thiết kế bởi tác giả của Joda Thời gian (Stephen Colebourne). He says nó được thiết kế tốt hơn.

  3. Joda Time

  4. java.util.Date

  5. hệ thống cấp bậc riêng biệt của các lớp:

    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. thời gian đại diện Ordered:

    case class History[T](events:List[T]) 
    
  7. Thời gian của mô hình. Một khi tôi đã có một đối tượng toàn cầu Timer với var currentTime:Long:

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

    Và ở khắp mọi nơi trong chương trình tôi gọi Timer.currentTimeMs để có được thời gian. Nó cho phép viết các bài kiểm tra xác định với sự thay đổi thời gian được kiểm soát. (Cẩn thận với biến toàn cầu! Bây giờ tôi thích sử dụng trường hợp riêng biệt của Timer để tránh vấn đề đồng thời.)

+2

Tôi muốn đặt Thời gian Joda vào vị trí đầu tiên trong danh sách. Và nó không phải là 'java.util.Date' có thể sử dụng trong Java 8, đó là các gói' java.time. * '. –

+0

Ngoài ra còn có Twitter util Thời gian, nhưng tôi vẫn tự hỏi khi nào bạn nên sử dụng cái này hay cái kia. – Mortimer

4

Tôi đoán tôi là một phần trách nhiệm cho việc này.

Vấn đề chung ở đây là hệ thống thời gian rất khó. Thực sự, thực sự, thực sự khó khăn.

Các nhà phát triển Akka làm việc về tiêu chuẩn hóa tương lai cần một cấu trúc để mô tả độ dài giữa hai điểm "ẩn danh" trong thời gian thực hiện chức năng của họ. Duration được xây dựng để giải quyết yêu cầu cụ thể này.

Mối quan tâm của tôi là mọi người có thể bắt đầu sử dụng lớp liên quan đến thời gian này cho những thứ không được thiết kế để đưa chúng tôi vào một tình huống khó khăn tương đương với java.util.Date/java.util.Calendar (không hoàn toàn vì Duration thực sự hoạt động cho trường hợp sử dụng) tấn người sẽ lạm dụng nó như một số loại scala.time mà nó không bao giờ có ý định.

Đó là lý do tại sao nó có ghi chú này và được đóng gói thành scala.concurrent.duration thay vì e. g. scala.time.

Tôi mong đợi gói hàng vận chuyển java.time với Java 8. Có thể chuẩn hóa điều đó trong tương lai để cải thiện khả năng tương tác một chút và có lợi ích bổ sung được thiết kế cho trường hợp sử dụng rộng hơn. (Có thể sẽ mất nhiều thời gian cho đến khi Scala sử dụng Java 8 làm đường cơ sở, mặc dù ...)

+0

Cảm ơn câu trả lời, tôi vẫn tự hỏi nếu có những ví dụ cụ thể về những gì bạn nên * không * làm với Thời lượng? – Mortimer

Các vấn đề liên quan