Java contienen dos tipos completamente diferentes de los miembros - los miembros de instancia (como BigDecimal.plus
) y miembros estáticos (como BigDecimal.valueOf
). En Scala, solo hay miembros de instancias. ¡Esto es en realidad una simplificación! Pero deja un problema: ¿dónde ponemos métodos como valueOf
? Ahí es donde los objetos son útiles.
class BigDecimal(value: String) {
def plus(that: BigDecimal): BigDecimal = // ...
}
object BigDecimal {
def valueOf(i: Int): BigDecimal = // ...
}
Usted puede ver esto pues la declaración de clase anónima y una sola ejemplificación de los mismos:
class BigDecimal$object {
def valueOf(i: Int): BigDecimal = // ...
}
lazy val BigDecimal = new BigDecimal$object
Al leer el código Scala, es crucial distinguir tipos de valores. He configurado IntelliJ para hightlight types blue.
val ls = List.empty[Int] // List is a value, a reference the the object List
ls: List[Int] // List is a type, a reference to class List
Java también tiene otro grado de complejidad que se eliminó en Scala: la distinción entre campos y métodos. Los campos no están permitidos en las interfaces, excepto si son estáticos y finales; los métodos pueden ser reemplazados, los campos en cambio están ocultos si se redefinen en una subclase. Scala elimina esta complejidad y solo expone los métodos al programador.
Finalmente, una respuesta simplista a su segunda pregunta: Si no declara ningún objeto, es posible que su programa nunca se ejecute, ya que para definir el equivalente de public static void main(String... args) {}
en Scala, ¡necesita al menos un objeto!
¿Por qué consideras que el enfoque de Scala fue más "complicado"?Después de trabajar con cada idioma, la solución de Scala es la más fácil, especialmente cuando entran en juego la herencia y el subtipificación. – soc