Java è in realtà una soluzione al problema che non tutte le espressioni valori di ritorno, quindi non è possibile scrivere questo in Java:
final String whatever = if (someCondition) {
"final value"
} else {
"other value"
}
Sempre più spesso, la tendenza in Java è quello di usare l'operatore ternario invece:
final String whatever = someCondition ? "final value" : "other value"
che va bene per questo caso un uso limitato, ma del tutto insostenibile, una volta che si avvia trattare con istruzioni switch e più costruttori.
L'approccio di Scala è diverso qui. Tutta la costruzione dell'oggetto deve passare attraverso un singolo costruttore "primario", tutte le espressioni restituiscono un valore (anche se è Unit
, equivalente a Java Void
) e l'iniezione del costruttore è fortemente favorita. Ciò comporta che i grafici degli oggetti siano costruiti in modo chiaro come un grafico aciclico diretto, e funziona anche molto bene con oggetti immutabili.
Si desidera inoltre essere consapevoli del fatto che dichiarare e definire variabili in operazioni separate è, in generale, una cattiva pratica quando si ha a che fare con più thread - e potrebbe lasciarti vulnerabile all'esposizione di null e condizioni di gara quando meno te lo aspetti (anche se questo non è veramente un problema durante la costruzione dell'oggetto). La creazione atomica di valori immutabili è solo un aspetto del modo in cui i linguaggi funzionali aiutano a gestire la concorrenza.
Significa anche che il compilatore Scala può evitare alcune delle analisi del flusso orribilmente complicate dalle specifiche del linguaggio Java.
Come detto in precedenza, la Scala Way ™ è:
val whatever =
if (someCondition)
"final value"
else
"other value"
Un approccio che scala anche ad altre strutture di controllo:
val whatever = someCondition match {
case 1 => "one"
case 2 => "two"
case 3 => "three"
case _ => "other"
}
Con un po 'di esperienza Scala scoprirete che questo stile aiuta il compilatore ad aiutarti e dovresti trovarti a scrivere programmi con meno bug!
Come fa il compilatore a verificare che sia effettivamente inizializzato? Sì, è possibile, ma difficile e non necessario. – delnan
Perché fino al punto di quell'inizializzazione, il valore è * non definito * e ha solo senso in termini di un flusso di controllo successivo. Nella programmazione funzionale, non ci sono valori indefiniti - e valori - non stati - sono le uniche cose che contano. – Dario
Beh, in pratica non esiste "non inizializzato". La JVM non supporta questo concetto. In Java questi campi "non inizializzati" hanno il valore 'null'. A causa del modo in cui funziona l'inizializzazione della classe, a volte è possibile accedere ai campi e recuperare i null bogus. Ciò porta a un codice che sembra insospettabile, ma genera 'NPE' in fase di runtime. Serializzazione/RMI aggiunge più problemi a tale approccio. Se sei interessato, guarda alcuni esempi in "Java Puzzlers". Fondamentalmente: Scala impedisce che accadano cose strane e riduce la necessità di valori non inizializzati, perché tutto è un'espressione. – soc