2012-04-14 3 views
2
 

class Foo() { 
val array // how do I leave initialization till later? 
def initializeArray(size : Int) = array = Array.ofDim[Int](size) 
} 
 

Der obige Code wird nicht kompiliert, also wie initialisiere ich mein Array zu einem späteren Zeitpunkt?Scala Initialisierung der Klassenebene Array-Variable innerhalb einer Methode

bearbeiten

glaube, ich brauche, eine Datei zu lesen, die eine Matrix von ganzen Zahl hat, und ich möchte die Matrix als eine zweidimensionale Matrix repräsentieren. Natürlich analysiere ich die Datei in der Foo Klasse und die Dimension der Matrix wird nicht bekannt sein, bis die Analyse durchgeführt wird.

+0

Warum müssen Sie die Initialisierung bis später verlassen? Es könnte sein, dass es eine bessere Lösung als "Initialisierung bis später verlassen" gibt. –

Antwort

2

Ein einfacher Weg wäre, es nur zu null zu initialisieren. Dazu müssen Sie einen Typen angeben, Array[Int] und eine var (statt val) zu machen, so dass Sie es später ändern könnten:

class Foo() { 
    var array: Array[Int] = null // how do I leave initialization till later? 
    def initializeArray(size : Int) = array = Array.ofDim[Int](size) 
} 

Dies ist jedoch in Scala nicht sehr gute Praxis ist. Es könnte besser sein Option ein verwenden:

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)) 
} 

Dieser einen Benutzer sagt ausdrücklich, dass es möglich ist, dass array auf nichts festgelegt werden kann, und vermeidet NullPointerException s. Sie können mehr über Option auf StackOverflow oder anderswo lesen.

Schließlich die besten Entwürfe in Scala verlassen sich auf unveränderliche Klassen. In einem solchen Fall würden Sie die Erstellung des Foo verzögern, bis Sie tatsächlich wissen, was Sie einfügen möchten. Ohne etwas über Ihr Design zu wissen, ist es jedoch schwer zu sagen, wie Sie das am besten einrichten können.

EDIT: Basierend auf Ihrer Beschreibung, würde ich Ihr Design in zwei Teile trennen: eine Methode zum Parsen der Datei und eine unveränderliche Foo zum Speichern des Endergebnisses.

class Foo(array: Array[Int]) { 

} 

object Foo { 
    def fromFile() = { 
    val array: Array[Int] = /* parse file into the right structure */ 
    new Foo(array) 
    } 
} 

Dann könnte man einfach sagen:

val foo = Foo.fromFile(filename) 

und die foo wäre eine vollständige, unveränderlich Foo sein.

+0

Ich dachte mir, was wäre eine Alternative zu dem, was ich versuche zu tun? Siehe meine Bearbeitung – nobody

+0

@qin, Bearbeitet basierend auf Ihrer Anforderung – dhg

4

Sie könnten ein lazy val z.

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 = [email protected] 

scala> f.array 
initializing... 
res46: Array[Int] = Array(0, 0, 0, 0, 0) 

Jetzt haben Sie verzögert, wenn das Array initialisiert wird.

Verwandte Themen