初期化されていないMyObject
インスタンスがあるとします。
var a:MyObject = null
これはnullに初期化する適切な方法ですか?
最後の手段としてnull
を使用します。既に述べたように、Option
はnullのほとんどの使用法を置き換えます。 null
を使用して、費用のかかる計算でフィールドの遅延初期化を実装する場合は、lazy val
を使用する必要があります。
つまり、Scalaはnull
をサポートします。個人的にSpring Dependency Injectionと組み合わせて使用します。
コードは完全に有効です。ただし、var t: T = _
を使用してt
をデフォルト値に初期化することをお勧めします。 T
がプリミティブの場合、タイプに固有のデフォルトを取得します。それ以外の場合は、null
を取得します。
これはより簡潔であるだけでなく、T
が何であるかを事前に知らない場合に必要です。
scala> class A[T] { var t: T = _ }
defined class A
scala> new A[String].t
res0: String = null
scala> new A[Object].t
res1: Java.lang.Object = null
scala> new A[Int].t
res2: Int = 0
scala> new A[Byte].t
res3: Byte = 0
scala> new A[Boolean].t
res4: Boolean = false
scala> new A[Any].t
res5: Any = null
Tが無制限の場合、var t: T= null
を使用するとコンパイルエラーになります。
scala> class A[T] { var t: T = null }
<console>:5: error: type mismatch;
found : Null(null)
required: T
class A[T] { var t: T = null }
T
がNULL可能であることの証拠として暗黙的なパラメーターを追加できます-AnyRef
のサブタイプではなくNotNull
のサブタイプこれは完全ではありません 焼き =、Scala 2.8でも、今のところは好奇心を考慮してください。
scala> class A[T](implicit ev: Null <:< T) { var t: T = null }
defined class A
正解はnullを使用しないでくださいです。代わりに、オプションタイプを使用します。
var a = None : Option[MyObject]
設定する場合:
a = Some(foo)
そして、それから読みたいときは、なしをテストします:
a match {
case None => Console.println("not here")
case Some(value) => Console.println("got: "+value)
}
デイビッドとレトロニムがすでに述べたように、ほとんどの場合、Option
を使用することをお勧めします。Option
を使用すると、結果なしの状況を処理する必要があることがより明確になります。ただし、Some(x)
を返すにはオブジェクトの作成が必要であり、.get
または.getOrElse
の呼び出しはif文よりもコストがかかる可能性があります。したがって、高性能コードでは、Option
を使用することが常に最善の戦略とは限りません(特に、コレクションルックアップコードでは、値を何度も検索し、それに応じて多くのオブジェクトを作成する必要はありません)。繰り返しますが、Webページ全体のテキスト(存在しない可能性があります)を返すようなことをしている場合、Optionを使用する理由はありませんnot。
また、null
を使用してジェネリックに関するレトロニムのポイントを追加するだけで、本当にnull
である必要がある場合は、これを完全に焼き付けた方法で実行できます。
class A[T >: Null] { var t: T = null }
これは2.7および2.8で機能します。それはNotNull
AFAIKに従わないので、<:<
メソッドよりも少し一般的ではありませんが、そうでなければ、あなたが望むであろうことを正確に行います。
Scalastyleがnull
でテスト内のオブジェクトを初期化するときにnullを使用しないように指示したため、この質問に出会いました。
Scalastyleを満たすタイプを変更しない私のソリューション:
var a: MyObject = (None: Option[MyObject]).orNull