2009-12-11 13 views
36

In Java verwende ich manchmal Klassenvariablen, um jeder neuen Instanz eine eindeutige ID zuzuweisen. Ich mache so etwas wieWas ersetzt Klassenvariablen in scala?

public class Foo { 

    private static long nextId = 0; 

    public final long id; 

    public Foo() { 
    id = nextId; 
    nextId++; 
    } 

    [...] 

} 

Wie kann ich das in Scala tun?

Antwort

60

Variablen auf dem Begleitobjekt:

object Foo{ 
    private var current = 0 
    private def inc = {current += 1; current} 
} 

class Foo{ 
    val i = Foo.inc 
    println(i) 
} 
25

Um auf Thomas' Antwort zu verstärken:

Die object Definition in der Regel in der gleichen Datei mit der Klasse gesetzt wird, und muss haben die gleichen Namen . Dies führt zu einer einzelnen Instanz eines Objekts mit dem Namen der Klasse, die alle Felder enthält, die Sie dafür definieren.

Ein handlicher Selbstreinigungsbausatz mit anderen Worten.

Auf der JVM-Ebene führt die Objektdefinition tatsächlich zur Definition einer neuen Klasse; Ich denke, es ist der gleiche Name mit einem $ angehängt, z.B. Foo$. Nur für den Fall, dass Sie einige dieser Dinge mit Java zusammenarbeiten müssen.

+1

Objekte müssen nicht den gleichen Namen wie Klassen haben, nur _companion objects_ do. – rightfold

+1

Wir neigen dazu, den gleichen Namen für Klasse und Objekt zu verwenden, da es beim Debuggen des Codes sehr hilfreich ist. –

+0

Diese beiden Antworten sollten kombiniert werden – Florian