1

列挙を説明する次のコードがあります。

package aicore2.worker.scheduling
    object Priority extends Enumeration with App {
      type Priority = Value

      /**
       * Action is performed immediately, any running action is interrupted
       * and action queue is cleared
       */
      val ACHTUNG = Value

      /**
       * Action is performed before all LOW, NORMAL and HIGHER actions
       */
      val HIGH = Value

      /**
       * Action is performed before all NORMAL and LOW actions
       */
      val HIGHER = Value

      /**
       * Standart priority for most actions
       */
      val NORMAL = Value

      /**
       * Action is added to the end of the queue. Desired for non-critical maintenance actions
       */
      val LOW= Value


      Priority.values  foreach println
    }

そしてテスト:

package aicore2.worker.scheduling

import org.junit.Assert._
import org.junit.Test
import aicore2.worker.scheduling.Priority._

class PriorityTypeTests {

  @Test
  def toStringTest()  {
    //Priority.values  foreach println
    //Priority.main(Array("2"))
    assertEquals(HIGH.toString(), "HIGH")
  }

  @Test
  def stringParseTest() {
     assertEquals(Priority.withName("HIGH"), HIGH)
  }

}

テストを実行すると、NPE (HIGH=null) が表示されます。

Priority as App を実行すると、必要なものがすべて得られます。 ACHTUNG HIGH HIGHER NORMAL LOW

テストを実行する前に Priority.main() を呼び出すと、同じ結果が得られ、NPE は発生しません。Priority ヘッダー (「with App」) から App trait mix-in を削除すると、すべてのテストが期待どおりにパスします。App トレイトを混在させると初期化順序に奇妙な点があることは理解していますが、私は Scala を初めて使用し (Java フィールドからの難民)、物事を理解するのに十分な経験がありません。

4

2 に答える 2

2

Appメソッドを実行するまでメンバーが初期化されないことを意味しますmain。REPL で次のことを試してください。

object A { val x = "foo" }
object B extends App { val x = "foo" }
A.x // = "foo"
B.x // = null

App を使用した Enumeration クラスでは、そのメソッドnullを呼び出すまで、すべてのメンバーが存在します。初期化されていないため、テストメソッドから nullPointerException が発生しmainます。HIGH.toString()HIGH

Enumerationしたがって、App特性を与えることは非常に悪い考えのように思えます。

于 2012-06-18T17:37:23.633 に答える
1

Appトレイトはトレイトを拡張し、(トレイトDelayedInitのアプリケーションの開始時に) 明示的に要求されるまでメンバーの初期化を遅らせますApp。これは、メイン メソッドで作成されたオブジェクトと考える必要があります。

AppandDelayedInitトレイトの詳細については、 Scala 2.9.0 リリース ノートを参照してください。

于 2012-06-18T15:21:38.363 に答える