Basic enumerations
trong Scala
là vụng về:
- Nếu bạn muốn sử dụng chúng trong mô hình khớp, bạn sẽ không thấy cảnh báo tiếp theo bởi trình biên dịch "đối sánh có thể không đầy đủ" và bạn có thể gặp phải bất ngờ với
scala.MatchError
trong runt ime.
- Chúng không tương thích với enum của Java - nó không phải là rất đáng sợ nếu bạn không hỗ trợ API cho Java, nhưng nếu bạn làm điều đó, nó có thể là một sự thất vọng bất ngờ cho bạn.
Quá tải với các điều tra của Scala không hoạt động do thực tế cùng một loại liệt kê sau khi xóa. Vì vậy, các ảnh chụp mã tiếp theo là không hợp lệ:
object WeekDays extends Enumeration {
val Mon, Tue, Wed, Thu, Fri = Value
}
object WeekEnds extends Enumeration {
val Sat, Sun = Value
}
object DaysOperations {
def f(x: WeekEnds.Value) = "That's a weekend"
def f(x: WeekDays.Value) = "That's a weekday"
}
Nó sẽ ném error: double definition: have the same type after erasure: (x: Enumeration#Value)String
. Như bạn thấy, scala.Enumeration
không thân thiện với người dùng và không thích sử dụng nó, nó sẽ làm cho cuộc sống của bạn dễ dàng hơn.
phương pháp tiếp cận bên phải: Cách tiếp cận ngay được bằng cách sử dụng sự kết hợp của case object
hoặc object
với sealed
lớp:
object WeekDays {
sealed trait EnumVal
case object Mon extends EnumVal
case object Tue extends EnumVal
case object Wed extends EnumVal
case object Thu extends EnumVal
case object Fri extends EnumVal
val daysOfWeek = Seq(Mon, Tue, Wed, Thu, Fri)
}
Ngoài ra, bạn có thể không sử dụng wrapper object
cho enum:
sealed trait Day { def description: String }
case object Monday extends Day { val description = "monday is awful" }
Tận dụng thư viện của bên thứ ba - Enumeratum cũng có thể giải quyết vấn đề của scala.enumeration
, đây là kiểu triển khai liệt kê loại an toàn và mạnh mẽ, dễ sử dụng và dễ hiểu.
libraryDependencies ++= Seq(
"com.beachape" %% "enumeratum" % enumeratumVersion
)
import enumeratum._
sealed trait Day extends EnumEntry
object Greeting extends Enum[Greeting] {
val values = findValues
case object Mon extends Day
case object Tue extends Day
case object Wed extends Day
case object Thu extends Day
case object Fri extends Day
}
Nguồn
2017-10-13 16:35:04
Cảm ơn! Nhưng đây là basiclly cùng một mã như tôi đã viết .. Trong ví dụ của bạn vẫn không có cách nào để ánh xạ một chuỗi để đối tượng trường hợp coresponding. – Tomer
Ví dụ: '' 'ProgressStatus (" CHẤP NHẬN ")' '' khớp '' 'ProgressStatus.ACCEPTED''' –
Cách tiếp cận tốt đẹp !!! – Dani