class Foo() {
val array // how do I leave initialization till later?
def initializeArray(size : Int) = array = Array.ofDim[Int](size)
}
上面的代码不会编译,那么以后如何初始化我的数组呢?
编辑
假设我需要读取一个包含整数矩阵的文件,并且我想将矩阵表示为二维数组。当然,我正在解析Foo
类中的文件,并且在解析完成之前不会知道矩阵的维度。
你可以使用一个惰性值,例如
scala> class Foo {
| lazy val array = initialize
| def initialize = {
| println("initializing...")
| new Array[Int](5)
| }
| }
defined class Foo
scala> val f = new Foo
f: Foo = Foo@135810c
scala> f.array
initializing...
res46: Array[Int] = Array(0, 0, 0, 0, 0)
现在你已经推迟了数组初始化的时间。
一种简单的方法是将其初始化为null
. 为此,您需要指定一个类型,Array[Int]
并使其成为var
(而不是val
),以便您以后可以更改它:
class Foo() {
var array: Array[Int] = null // how do I leave initialization till later?
def initializeArray(size : Int) = array = Array.ofDim[Int](size)
}
但是,这在 Scala 中并不是很好的做法。最好使用一个Option
:
class Foo() {
var array: Option[Array[Int]] = None // how do I leave initialization till later?
def initializeArray(size : Int) = array = Some(Array.ofDim[Int](size))
}
这明确地告诉用户,它array
可能不会被设置为任何东西,并避免NullPointerException
s。您可以在 StackOverflow 或其他地方阅读更多信息Option
。
最后,Scala 中最好的设计依赖于不可变类。在这种情况下,您将推迟创建,Foo
直到您真正知道要放入其中的内容。但是,在不了解您的设计的任何其他信息的情况下,很难说如何最好地进行设置。
编辑:根据您的描述,我会将您的设计分为两部分:用于解析文件的方法和Foo
用于存储最终结果的不可变对象。
class Foo(array: Array[Int]) {
}
object Foo {
def fromFile() = {
val array: Array[Int] = /* parse file into the right structure */
new Foo(array)
}
}
然后你可以说:
val foo = Foo.fromFile(filename)
这foo
将是一个完整的、不可变的Foo
.