假设我有这样的代码:
val parsedMessage: JsResult[Message] = Json.fromJson(Json.parse(msg))
val message: Message = parsedMessage.getOrElse {
log.warning("Invalid json: {}", msg)
RejectedMessageEvent(msg)
}
val newMessageEvent: NewMessageEvent = NewMessageEvent (userId, message.to, message.text)
messagePersistentActor ! message
显然,这会在编译时失败,因为getOrElse
不会返回Message
类型的对象。但是假设,由于某种原因,parsedMessage
失败了,我进入了getOrElse
的“else”部分。在这里,我希望要么停止进程(在Java语言中是一个return
),要么返回一个RejectedMessageEvent
--这会像预期的那样给出一个编译错误。
作为一个典型的Java开发人员,我热衷于使用:
if(parsedMessage.isError) {
log.warning("Invalid json: {}", msg)
messagePersistentActor ! RejectedMessageEvent(msg)
}
else {
val newMessageEvent: NewMessageEvent = NewMessageEvent (userId, message.to, message.text, UUID.randomUUID().toString, DateTime.now.getMillis)
messagePersistentActor ! message
}
但我觉得这不是Scala的最佳实践。
如果我想在getOrElse
中停止进程,或者返回与该变量声明的对象类型不同的对象类型,您将如何解决这种情况?
我知道我可以省略val message: Message = parsedMessage.getOrElse
中的消息类型声明,使其成为简单的val message = parsedMessage.getOrElse
,但是这样我就不能在NewMessageEvent
case类构造函数上执行message.to
和message.text
,因为message
可以是Message
或RejectedMessageEvent
类型。
我使用的是case类,也可以使用继承(RejectedMessageEvent
和NewMessageEvent
都是对Message
的扩展),但我尽量避免使用这种解决方案,而是使用更实用的解决方案。
转载请注明出处:http://www.qdnewhouse.com/article/20230526/1900570.html