2009-12-11 13 views
36

W języku Java czasami używam zmiennych klas, aby przypisać unikalny identyfikator do każdej nowej instancji. Robię coś takiego, jak:Co zastępuje zmienne klasy w scala?

public class Foo { 

    private static long nextId = 0; 

    public final long id; 

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

    [...] 

} 

Jak mogę to zrobić w Scali?

Odpowiedz

60

Zmienne temat obiektu towarzyszącego:

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

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

Aby wzmocnić na Thomasa odpowiedź:

Definicja object zazwyczaj umieścić w tym samym pliku z klasą, a moszczu mieć taką samą nazwę . Powoduje to pojedyncze wystąpienie obiektu o nazwie klasy, która zawiera dowolne zdefiniowane dla niego pola.

Poręczny zestaw do majsterkowania Singleton, innymi słowy.

Na poziomie JVM definicja obiektu faktycznie powoduje definicję nowej klasy; Myślę, że jest to ta sama nazwa z dołączonym $, np. Foo$. Na wypadek, gdybyś musiał współdziałać z niektórymi z tych rzeczy z Javą.

+1

Obiekty nie muszą mieć tej samej nazwy co klasy, tylko _companion objects_ do. – rightfold

+1

Mamy tendencję do używania tej samej nazwy dla klasy i obiektu, ponieważ bardzo pomaga w debugowaniu kodu. –

+0

Te dwie odpowiedzi należy połączyć – Florian