class Foo() {
val array // how do I leave initialization till later?
def initializeArray(size : Int) = array = Array.ofDim[Int](size)
}
上面的代码不会编译,所以如何在以后初始化我的数组?
假设我需要读取一个具有整数矩阵的文件,并且我想将矩阵表示为二维数组。当然,我正在解析Foo
类中的文件,并且在解析完成之前将不知道矩阵的维度。
答案 0 :(得分:4)
你可以使用懒惰的词,例如
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)
现在,您已在数组初始化时延迟。
答案 1 :(得分:3)
一种简单的方法是将其初始化为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
。您可以在StackOverflow或其他地方阅读有关Option
的更多信息。
最后,Scala中最好的设计依赖于 immutable 类。在这种情况下,您将推迟创建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
。