Diferencia entre objeto y clase en Scala


Solo estoy repasando algunos tutoriales de Scala en Internet y he notado que en algunos ejemplos se declara un objeto al comienzo del ejemplo.

¿Cuál es la diferencia entre class y object en Scala?

Author: Michal Kordas, 2009-11-18

13 answers

Tl; dr

  • class C define una clase, al igual que en Java o C++.
  • object Ocrea un objeto singleton O como instancia de alguna clase anónima; se puede usar para contener miembros estáticos que no están asociados con instancias de alguna clase.
  • object O extends T hace que el objeto O sea una instancia de trait T; luego puede pasar O en cualquier lugar, se espera un T.
  • si hay un class C, entonces object C es el objeto compañero de la clase C; nota que el objeto compañero es no automáticamente una instancia de C.

También vea la documentación de Scala para objetoy clase.

Uso como anfitrión de miembros estáticos

La mayoría de las veces, necesita un object para contener métodos y valores/variables que estarán disponibles sin tener que instanciar primero una instancia de alguna clase. Este uso está estrechamente relacionado con los miembros static en Java.

object A {
  def twice(i: Int): Int = 2*i
}

Luego puede llamar al método anterior usando A.twice(2).

Si twice fuera un miembro de alguna clase A, entonces necesitaría hacer una instancia primero:

class A() {
  def twice(i: Int): Int = 2 * i
}

val a = new A()
a.twice(2)

Puede ver cómo esto es redundante, ya que twice no requiere ningún dato específico de la instancia.

Uso como una instancia con nombre especial

También puedes usar el propio object como una instancia especial de una clase o rasgo. Al hacer esto, su objeto necesita extender algunos trait para convertirse en una instancia de una subclase de se.

Considere el siguiente código:

object A extends B with C {
  ...
}

Esta declaración declara primero una clase anónima (inaccesible) que se extiende tanto B como C, y crea una instancia única de esta clase llamada A.

Esto significa que A se puede pasar a funciones que esperan objetos de tipo B o C, o B with C.

Características adicionales de object

También existen algunas características especiales de los objetos en Scala. Recomiendo leer el documentación oficial.

  • def apply(...) habilita la sintaxis habitual sin nombre del método de A(...)
  • def unapply(...) permite crear patrones personalizados extractores
  • si acompaña a una clase del mismo nombre, el objeto asume un papel especial al resolver parámetros implícitos
 472
Author: ziggystar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-27 08:47:38

A class es una definición, una descripción. Define un tipo en términos de métodos y composición de otros tipos.

Un object es un singleton an una instancia de una clase que se garantiza que es única. Para cada object en el código, se crea una clase anónima, que hereda de cualquier clase que haya declarado object implementar. Esta clase no se puede ver desde el código fuente de Scala though aunque se puede llegar a ella a través de la reflexión.

Existe una relación entre object y class. Se dice que un objeto es el objeto compañero de una clase si comparten el mismo nombre. Cuando esto sucede, cada uno tiene acceso a métodos de visibilidad private en el otro. Sin embargo, estos métodos no se importan automáticamente. Usted tiene que importarlos explícitamente, o prefijarlos con el nombre de la clase/objeto.

Por ejemplo:

class X {
  // class X can see private members of object X
  // Prefix to call
  def m(x: Int) = X.f(x)

  // Import and use
  import X._
  def n(x: Int) = f(x)

  private def o = 2
}

object X {
  private def f(x: Int) = x * x

  // object X can see private members of class X
  def g(x: X) = {
    import x._
    x.o * o // fully specified and imported
   }
}
 233
Author: Daniel C. Sobral,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-14 20:36:19

Un objeto tiene exactamente una instancia (no se puede llamar a new MyObject). Puede tener múltiples instancias de una clase.

Objeto sirve a la mismo (y algunos adicionales) propósitos como los métodos y campos estáticos en Java.

 63
Author: Thomas Jung,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-27 13:28:56

Como muchos han explicado, object define una instancia singleton. La única cosa en las respuestas aquí que creo que se omite es que object sirve para varios propósitos.

  • Puede ser el objeto compañero de un class/trait, contiene lo que podrían considerarse métodos estáticos o métodos de conveniencia.

  • Puede actuar como un módulo, conteniendo tipos y definiciones relacionados/subsidiarios, etc.

  • Puede implementar una interfaz por extendiendo un class o uno o más trait s.

  • Puede representar un caso de un sealed trait que no contiene datos. En este sentido, a menudo se considera más correcto que un case class sin parámetros. El caso especial de un sealed trait con solo implementadores case object es más o menos la versión Scala de una enumeración.

  • Puede actuar como evidencia para la lógica impulsada por implicit.

  • Introduce un tipo singleton.

Es un muy poderoso y general construir. Lo que puede ser muy confuso para los principiantes de Scala es que la misma construcción puede tener usos muy diferentes. Y un object puede servir a muchos de estos diferentes usos a la vez, lo que puede ser aún más confuso.

 16
Author: acjay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-20 01:20:35

Definir un objeto en Scala es como definir una clase en Java que solo tiene métodos estáticos. Sin embargo, en Scala un objeto puede extender otra superclase, implementar interfaces, y ser pasado como si fuera una instancia de una clase. (Así que es como los métodos estáticos en una clase, pero mejor).

 14
Author: Ken Bloom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-10-04 15:27:32

La diferencia formal -

  1. no puede proporcionar parámetros de constructor
  2. no es un tipo - no puede crear una instancia con un operador nuevo. Pero puede tener campos, métodos, extender una superclase y mezclar rasgos.

La diferencia en el uso:

  • Scala no tiene métodos ni campos estáticos. En su lugar, debe usar object. Puede usarlo con o sin clase relacionada. En 1er caso se llama un objeto compañero. Tienes que:
    1. uso el mismo nombre para la clase y el objeto
    2. ponlos en el mismo archivo fuente.
  • Para crear un programa debe usar el método principal en object, no class.

    object Hello {
      def main(args: Array[String]) {
        println("Hello, World!")
      }
    }
    
  • También puede usarlo como usa el objeto singleton en java.

      
        
      

 12
Author: irudyak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-10-29 13:45:17

La palabra clave object crea un nuevo tipo singleton, que es como una clase que solo tiene una sola instancia con nombre. Si está familiarizado con Java, declarar un objeto en Scala es muy parecido a crear una nueva instancia de una clase anónima.

Scala no tiene equivalente a la palabra clave static de Java, y un objeto se usa a menudo en Scala donde se puede usar una clase con miembros estáticos en Java.

 4
Author: Amine Sagaama,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-12 14:20:14

Object es una clase pero ya tiene(es) una instancia, por lo que no puede llamar a new ObjectName. Por otro lado, Class es solo tipo y puede ser una instancia llamando a new ClassName().

 2
Author: Yonggoo Noh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-13 11:15:39

Clase Scala igual que Clase Java pero scala no le da ningún método de entrada en clase, como el método principal en java. El método principal asociado con la palabra clave object. Puede pensar en la palabra clave object como la creación de un objeto singleton de una clase que se define implícitamente.

Más información consulte este artículo palabra clave de clase y objeto en programación scala

 1
Author: FOD,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-22 17:52:18

En scala, no hay un concepto static. Así que scala crea un objeto singleton para proporcionar un punto de entrada para la ejecución de su programa. Si no crea un objeto singleton, su código se compilará correctamente pero no producirá ninguna salida. Los métodos declarados dentro del objeto Singleton son accesibles globalmente. Un objeto singleton puede extender clases y rasgos.

Ejemplo de Objeto Scala Singleton

object Singleton{  
    def main(args:Array[String]){  
        SingletonObject.hello()         // No need to create object.  
    }  
}  


object SingletonObject{  
    def hello(){  
        println("Hello, This is Singleton Object")  
    }  
}  

Salida:

Hello, This is Singleton Object

En scala, cuando se tiene una clase con el mismo nombre que el objeto singleton, se llama clase companion y el objeto singleton se llama objeto companion.

La clase companion y su objeto companion deben definirse en el mismo archivo fuente.

Scala Companion Object Example

class ComapanionClass{  
    def hello(){  
        println("Hello, this is Companion Class.")  
    }  
}  
object CompanoinObject{  
    def main(args:Array[String]){  
        new ComapanionClass().hello()  
        println("And this is Companion Object.")  
    }  
}  

Salida:

Hello, this is Companion Class.
And this is Companion Object.

En scala, una clase puede contener:

1. Miembro de datos

2. Método miembro

3. Bloque constructor

4. Clase anidada

5. Información de clase estupenda etc.

Debe inicializar todas las variables de instancia de la clase. No hay un ámbito predeterminado. Si no especifica el ámbito de acceso, es público. Debe haber un objeto en el que se defina el método main. Proporciona un punto de partida para su programa. Aquí, hemos creado un ejemplo de clase.

Ejemplo de Scala Ejemplo de Clase

class Student{  
    var id:Int = 0;                         // All fields must be initialized  
    var name:String = null;  
}  
object MainObject{  
    def main(args:Array[String]){  
        var s = new Student()               // Creating an object  
        println(s.id+" "+s.name);  
    }  
} 

Lo siento, estoy demasiado tarde pero espero que te ayude.

 1
Author: Bhaskar Das,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-01 18:11:39

El objeto es igual a la clase estática en Java a algunas extensiones, las características estáticas significan que la clase estática no necesita crear un objeto al poner a la JVM, puede ser utilizado por su nombre de clase directamente

 0
Author: David,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-03 08:20:50

Si viene de un entorno java, el concepto de clase en scala es similar a Java, pero la clase en scala no puede contener miembros estáticos.

Los objetos en scala son de tipo singleton se llama a los métodos dentro de él utilizando el nombre del objeto, en scala object es una palabra clave y en java object es una instancia de la clase

 0
Author: Vivek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-04 11:40:38

Clase y objeto: una clase es una definición que describe todos los atributos de una entidad o un objeto. Y objeto es una instancia de una clase.

 -22
Author: ABHAY PRATAP SINGH,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-04 15:16:28