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').