tutorial software renault instalar examples scala

software - scala wikipedia



Singletons como clases sintéticas en Scala? (2)

Estoy leyendo Programación en Scala y no comprendo la siguiente oración (pdf p.112):

Cada objeto singleton se implementa como una instancia de una clase sintética referenciada desde una variable estática, por lo que tienen la misma semántica de inicialización que las estadísticas de Java.

¿Significa esto que si tengo un FletBar singleton en Scala , el compilador creará una clase llamada FooBar $ ?

Además, ¿qué quiere decir el autor con "referenciado desde una variable estática"? ¿Hay alguna variable estática oculta en algún lugar que contenga una referencia a alguna clase FooBar $ ?

Aprecio cualquier ayuda aquí.


Básicamente tienes razón.

Si tienes el singleton

object Singleton { def method = "Method result" }

entonces la compilación te da

Singleton.class Singleton$.class

y para el código de bytes que encuentre, primero para Singleton :

public final class Singleton extends java.lang.Object{ public static final java.lang.String method(); Signature: ()Ljava/lang/String; Code: 0: getstatic #11; //Field Singleton$.MODULE$:LSingleton$; 3: invokevirtual #13; //Method Singleton$.method:()Ljava/lang/String; 6: areturn }

es decir, un método estático público para cada método de la clase que hace referencia a algo llamado Singleton$.MODULE$ , y en Singleton$ :

public final class Singleton$ extends java.lang.Object implements scala.ScalaObject{ public static final Singleton$ MODULE$; Signature: LSingleton$; public static {}; Signature: ()V Code: 0: new #9; //class Singleton$ 3: invokespecial #12; //Method "<init>":()V 6: return public java.lang.String method(); Signature: ()Ljava/lang/String; Code: 0: ldc #16; //String Method result 2: areturn private Singleton$(); Signature: ()V Code: 0: aload_0 1: invokespecial #20; //Method java/lang/Object."<init>":()V 4: aload_0 5: putstatic #22; //Field MODULE$:LSingleton$; 8: return }

Donde vea que MODULE$ es lo que contiene la instancia de Singleton$ , y el method es solo un método ordinario.

Entonces, eso es todo lo que hay: crear Singleton$ con un campo estático llamado MODULE$ para mantener la instancia única de sí mismo, rellenar ese campo y luego crear un Singleton con métodos estáticos que reenvíen todas las llamadas estáticas a los métodos apropiados Singleton$ .


El capítulo 31 de la misma "Programación en Scala" es más preciso:

Java no tiene un equivalente exacto a un objeto singleton, pero sí tiene métodos estáticos.

La traducción de Scala de objetos singleton utiliza una combinación de métodos estáticos y de instancia. Para cada objeto Singleton de Scala, el compilador creará una clase Java para el objeto con un signo de dólar agregado al final .
Para un objeto singleton llamado App , el compilador produce una clase Java llamada App$ .
Esta clase tiene todos los métodos y campos del objeto Singleton de Scala.
La clase Java también tiene un único campo estático llamado MODULE$ para contener la instancia de la clase que se crea en el tiempo de ejecución.
Como ejemplo completo, suponga que compila el siguiente objeto Singleton:

object App { def main(args: Array[String]) { println("Hello, world!") } }

Scala generará una clase de $ Java App con los siguientes campos y métodos:

$ javap App$ public final class App$ extends java.lang.Object implements scala.ScalaObject{ public static final App$ MODULE$; public static {}; public App$(); public void main(java.lang.String[]); public int $tag(); }

Esa es la traducción para el caso general.