Category Hierarchy

假设我有这样的代码:

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.tomessage.text,因为message可以是MessageRejectedMessageEvent类型。

我使用的是case类,也可以使用继承(RejectedMessageEventNewMessageEvent都是对Message的扩展),但我尽量避免使用这种解决方案,而是使用更实用的解决方案。

转载请注明出处:http://www.qdnewhouse.com/article/20230526/1900570.html