Java contengono due tipi completamente diversi di membri - membri di istanza (come ad esempio BigDecimal.plus
) e membri statici (come ad esempio BigDecimal.valueOf
). In Scala, ci sono solo membri di istanza. Questa è in realtà una semplificazione! Ma lascia un problema: dove mettiamo metodi come valueOf
? Ecco dove gli oggetti sono utili.
class BigDecimal(value: String) {
def plus(that: BigDecimal): BigDecimal = // ...
}
object BigDecimal {
def valueOf(i: Int): BigDecimal = // ...
}
È possibile visualizzare questo come la dichiarazione di classe anonima e un singolo di un'istanza dello stesso:
class BigDecimal$object {
def valueOf(i: Int): BigDecimal = // ...
}
lazy val BigDecimal = new BigDecimal$object
Durante la lettura di codice Scala, è fondamentale per distinguere i tipi di valori. Ho configurato IntelliJ per i tipi hightlight blu.
Java ha anche un altro grado di complessità rimosso in Scala: la distinzione tra campi e metodi. I campi non sono consentiti sulle interfacce, tranne se sono statici e definitivi; i metodi possono essere sovrascritti, i campi invece sono nascosti se ridefiniti in una sottoclasse. Scala elimina questa complessità e espone solo metodi al programmatore.
Infine, una risposta glib alla tua seconda domanda: se non si dichiara alcun oggetto, sei programma può mai eseguito, come di definire l'equivalente di public static void main(String... args) {}
a Scala, è necessario almeno un oggetto!
Perché consideri l'approccio che Scala ha assunto per essere più "complicato"?Dopo aver lavorato con ciascuna lingua, la soluzione di Scala è di gran lunga la più semplice, soprattutto quando entrano in gioco l'ereditarietà e la sub-tipizzazione. – soc