作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了名为 LogActor 的 akka actor。
LogActors 的接收方法处理来自其他参与者的消息并将它们记录到指定的日志级别。
我可以通过两种方式区分不同的级别。第一个:
import LogLevel._
object LogLevel extends Enumeration {
type LogLevel = Value
val Error, Warning, Info, Debug = Value
}
case class LogMessage(level : LogLevel, msg : String)
abstract class LogMessage(msg : String)
case class LogMessageError(msg : String) extends LogMessage(msg)
case class LogMessageWarning(msg : String) extends LogMessage(msg)
case class LogMessageInfo(msg : String) extends LogMessage(msg)
case class LogMessageDebug(msg : String) extends LogMessage(msg)
最佳答案
我完全同意 Alexey 和 Dennis 的观点,在这种情况下,性能不应该打扰您,因为它更多是编译器优化的问题,而不是开发人员,而且我无法想象性能差异会变得明显的情况。
应该困扰您的是您的代码一致性,从这个意义上说,您应该根据您是要坚持使用第一个示例中正确描述的带有枚举的旧 java-ish 方法,还是最近流行的 来做出决定。代数数据类型 (ADT) 模式。您试图在第二个示例中表示后者,但有一些错误。
以下是如何使用 ADT 模式正确解决问题。
ADT 解决方案 #1
// 1. marked `sealed` to make pattern matching exhaustive
// 2. used a trait to avoid double storage of msg` and
// make the inheritance easier
sealed trait LogMessage { def msg : String }
// A better solution for isolation than names like "LogMessageError".
// Allows you to either address the members with a namespace like
// "LogMessage.Error" or do "import LogMessage._" and address them
// directly
object LogMessage {
case class Error (msg : String) extends LogMessage
case class Warning (msg : String) extends LogMessage
case class Info (msg : String) extends LogMessage
case class Debug (msg : String) extends LogMessage
}
sealed trait LogLevel
object LogLevel {
case object Error extends LogLevel
case object Warning extends LogLevel
case object Info extends LogLevel
case object Debug extends LogLevel
}
case class LogMessage ( level : LogLevel, msg : String )
关于Scala - 枚举与案例类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13343513/
我是一名优秀的程序员,十分优秀!