1

同じコードの 3 つのバリエーションをテストしたところ、問題なく動作しました。異なる動作の理由を知りたいです。

だから私は、長いタイムスタンプをECMA日付標準形式の文字列に変換するこの作業コードを持っています:

  lazy val dateFormat = new java.text.SimpleDateFormat("yyyy-MM-DD'T'HH:mm:ss.sssZ")

  implicit def dateToECMAFormat(time: Long) = new {
    def asECMADateString: String = {
      dateFormat.format(new java.util.Date(time))
    }
  }

動作する他のバリエーション:

  implicit def dateToECMAFormat(time: Long) = new {
    val dateFormat = new java.text.SimpleDateFormat("yyyy-MM-DD'T'HH:mm:ss.sssZ")

    def asECMADateString: String = {
      dateFormat.format(new java.util.Date(time))
    }
  }

しかし、SimpleDateFormat が常に再インスタンス化されることは望ましくありません。だから私は最初のものを好みます。しかし今、本当の謎:

  val dateFormat = new java.text.SimpleDateFormat("yyyy-MM-DD'T'HH:mm:ss.sssZ")

  implicit def dateToECMAFormat(time: Long) = new {
    def asECMADateString: String = {
      dateFormat.format(new java.util.Date(time))
    }
  }

この最後のコードはコンパイルされますが、実行時に例外がスローされます。Play フレームワークからスタック トレースを取得できませんでした。Play フレームワーク 2.1 のコントローラーが 500 (Internal Server Error) を返し、それ以上の情報がないことを知っているだけです (他のコントローラーは動作しますが、主要なサービスはまだ稼働しています)。

いずれの場合も、呼び出しは次のようになります。100000L.asECMADateString

誰かが私にさまざまな動作を説明できますか?最後の動作が機能しないのはなぜですか? val、lazy val、def の違いはよく理解できましたが、何かが足りないように感じます。

アップデート

コードは次のようにオブジェクトで呼び出されます。

object MyController extends Controller{

  implicit val myExecutionContext = getMyExecutionContext

  lazy val dateFormat = new java.text.SimpleDateFormat("yyyy-MM-DD'T'HH:mm:ss.sssZ")

  implicit def dateToECMAFormat(time: Long) = new {
    def asECMADateString: String = {
      dateFormat.format(new java.util.Date(time))
    }
  }

  def myAction = Action {
    Async {
     future {
       blocking{
         //here get some result from a db
         val result = getStuffFromDb
         result.someLong.asECMADateString
       }
     } map { result => Ok(result) } recover { /* return some error code */ }
   }
  }
}

これは、基本的な playframework Async アクション コールです。

4

1 に答える 1

2

Since the difference between the 1st and 3rd examples are the lazy val, I'd be looking at exactly where your call (100000L.asECMADateString) is being made. lazy val helps correct some "order of initialization" issues with mix-ins, for example: see this recent issue to see if it's similar to yours.

于 2013-05-20T15:11:48.137 に答える