복붙노트

[SCALA] 스칼라에서 합성 클래스로 싱글 톤?

SCALA

스칼라에서 합성 클래스로 싱글 톤?

내가 스칼라 프로그래밍을 읽고있다, 나는 다음 문장 (PDF의 P.112)을 이해하지 않는다 :

내가 스칼라에서 싱글 FOOBAR이있는 경우 이것이 의미 하는가, 컴파일러는 FOOBAR $라는 이름의 클래스를 만들 것인가?

또한 무슨 일이 "정적 변수에서 참조"에 의해 저자의 의미는 무엇입니까? 일부는 foobar $ 클래스에 대한 참조를 들고 숨겨진 정적 변수 곳이 있습니까?

나는 여기에 어떤 도움을 주셔서 감사합니다.

해결법

  1. ==============================

    1.같은 "스칼라 프로그래밍"의 장 (31)는 더 정확합니다 :

    같은 "스칼라 프로그래밍"의 장 (31)는 더 정확합니다 :

    object App {
      def main(args: Array[String]) {
        println("Hello, world!")
      }
    }
    
    $ 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();
    }
    
  2. ==============================

    2.당신은 기본적으로 올바른입니다.

    당신은 기본적으로 올바른입니다.

    당신은 싱글이있는 경우

    object Singleton {
      def method = "Method result"
    }
    

    다음 컴파일을 제공합니다

    Singleton.class
    Singleton$.class
    

    그리고 바이트 코드에 대해 당신은 싱글 먼저 발견 :

    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
    }
    

    즉, 참조 뭔가 싱글 $ .MODULE $라고하는 클래스의 각 방법에 대한 공공 정적 방법이며, 싱글 $의 :

    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
    }
    

    당신이 볼 경우 해당 모듈의 $는 싱글 $의 인스턴스를 보유하고 있으며 방법은 그냥 평범한 방법입니다 것입니다.

    그래서, 정말이 전부 여기에 있습니다 : 정적 필드라는 모듈의 $로 싱글 $를 작성하는 것은, 필드, 다음 만드는 것이 채우기를 자체의 고유 한 인스턴스를 유지하기 위해 싱글 정적 방법과 그에서 적절한 방법으로 앞으로 모든 정적 호출 싱글 $.

  3. from https://stackoverflow.com/questions/5721046/singletons-as-synthetic-classes-in-scala by cc-by-sa and MIT license