venerdì 2 luglio 2010

Differenza tra 'object' e 'class' in Scala

Una delle cose che trovo più intelligenti nel linguaggio Scala, è la netta distinzione tra Tipo Object e Tipo Class. Il primo è un tipo che può avere soltanto una istanza. Il secondo è un tipo che può avere molteplici istanze.

Il primo ha sintassi 'object', il secondo 'class'.

Chiaramente il primo, essendo sostanzialmente una classe "statica", non va istanziato, i suoi metodi possono essere chiamati direttamente. Il secondo va istanziato.

Ecco un esempio:

class Molteplice(nr : Int)
{
def id = nr;

def parla()
{
println("Buongiorno, sono il Molteplice nr = " + id);
}
}

object Singleton
{
def parla()
{
println("Buongiorno, sono un singleton.");
}
}

object Main
{
def main(args : Array[String]) : Unit =
{
Singleton.parla();
val range = 0.until(10);

for (i <- range)
{
val m = new Molteplice(i);
m.parla();
}

}
}



Questo ci permette di capire subito le intenzioni del programmatore, che deve creare classi solamente dove questo ha realmente senso.

Nella mia esperienza di programmatore OO (in Java, C++ e C#), direi che su 100 tipi in un programma normale, ad esempio di integrazione aziendale, 70 sono singleton (cioè in Scala 'object'), ovvero collezioni statiche di metodi e proprietà, e solo 30 classi vere e proprie (in Scala, 'class').