2010-06-27 23 views
7

Viniendo de Java, estoy confundido por la distinción clase/objeto de scala. Tenga en cuenta que no solicito la diferencia formal; hay suficientes referencias en la web que explican esto, y hay preguntas relacionadas en SO.Scala - ¿hay suficientes clases?

Mis preguntas son:

  1. ¿Por qué los diseñadores de Scala choosed para hacer las cosas más complicadas (en comparación con Java o C# )? ¿Qué desventajas tengo para esperar si ignoro esta distinción y solo declaro las clases?

Gracias.

+1

¿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

Respuesta

23

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!

+0

La palabra clave object le da una clase singleton (debajo del capó de todos modos) y es el reemplazo de Scala para miembros estáticos. – apollodude217

+3

Tenga en cuenta que si tiene una clase llamada 'Something' y un objeto llamado' Something' (en el mismo paquete), entonces esos dos están vinculados: el objeto es el * objeto complementario * de la clase, y los dos pueden ver los miembros privados de cada uno. Comparando con Java: piense en los métodos de la clase como los métodos de instancia y los métodos en el objeto como los métodos estáticos que pertenecen a esa clase. – Jesper

+1

Buen punto, Jesper. Además, el objeto complementario 'T' de una clase o rasgo' T' está en el ámbito implícito al buscar valores implícitos un tipo 'X', dado que' T' o un subtipo de 'T' es una parte del tipo 'X'. Esto se usa para encontrar vistas implícitas y argumentos implícitos. – retronym

0

Una forma de ver esto es esto. Un programa de ejecución consiste en una comunidad de objetos e hilos. Los subprocesos ejecutan código dentro del contexto de objetos, es decir, siempre hay un objeto "este" que ejecuta un subproceso. Esta es una simplificación de Java en el sentido de que en Java, no siempre hay un "esto". Pero ahora hay un problema de huevo/pollo. Si los objetos se crean mediante subprocesos y los subprocesos se ejecutan dentro de los objetos, ¿qué objeto es el primer subproceso que se ejecuta inicialmente dentro? Tiene que haber un conjunto no vacío de objetos al comienzo de la ejecución del programa. Estos son los objetos declarados con la palabra clave object.

Cuestiones relacionadas