如何在创建案例类时自动调用方法

时间:2018-06-06 13:23:56

标签: scala logging playframework

我在我的Play应用程序中添加日志记录,为了避免繁琐和重复的代码,我创建了一个带有格式化函数的case类,以便清理我的日志:

final case class LogMessage(keyValuePairs: (String, String)*) {
  def jsonify: String =
    s"""{${keyValuePairs map { case (key, value) => s""""$key":"$value"""" } mkString "," }}"""
}

目前,为了调用此方法,我必须执行以下操作:

Logger.info(LogMessage(("message", s"here is my message")).jsonify)
// jsonify prints:
// {"message":"here is my message"}

这样运行正常,但我不喜欢每次创建一个新的case类后我需要写.jsonify。是否有办法在创建LogMessage案例类时自动调用此方法,因此我的代码中没有写jsonify?我已经阅读了有关隐式方法的内容,但只是将方法更改为implicit def jsonify = ...并没有做任何事情。

1 个答案:

答案 0 :(得分:3)

这可以通过覆盖toString的{​​{1}}方法来解决,但也有更好的选择。

由于实际上不需要使用LogMessage的实例,我们可以使用LogMessage方法实现object,该方法将用作从元组到jsonified String的转换器:< / p>

apply()

可以用作:

object JsonifiedMessage {

  def apply(keyValuePairs: (String, Any)*): String = {
    val jsonified = keyValuePairs.map { case (key, value) => s""""$key":"$value"""" }.mkString(",")
    s"{${jsonified}}"
  }

}