Scala 類的主構造方法中屬性修飾符的作用與區別

衆所周知,Scala 是運行於Java平臺(Java虛擬機)的,那麼Scala程序編譯之後會生成對應的字節碼文件,我們將字節碼文件反編譯成Java文件即可知Scala 爲我們都做了什麼.

  1. Scala 源代碼

    
    class Test4(a: String)
    
    class Test5(val b: String, var c: String)
    
    class Test6(private val d: String, private var e: String)
    
    class Test7(private[this] val f: String, private[this] var g: String)
    
    class Test8(@BeanProperty val f: String, @BeanProperty var g: String)
    
    //貌似這種寫法沒有什麼用
    class Test9(@BeanProperty private[this] val f: String, @BeanProperty private[this] var g: String)
  2. 反編譯後的Java代碼

    public class Test4
    {
      public Test4(String a)
      {
      }
    }
    
    public class Test5
    {
      private final String b;
      private String c;
    
      public String b(){return this.b; } 
      public String c() { return this.c; } 
      public void c_$eq(String x$1) { this.c = x$1; }
    
    
      public Test5(String b, String c)
      {
      }
    }
    
    public class Test6
    {
      private final String d;
      private String e;
    
      private String d(){return this.d; } 
      private String e() { return this.e; } 
      private void e_$eq(String x$1) { this.e = x$1; }
    
    
      public Test6(String d, String e)
      {
      }
    }
    
    public class Test7
    {
      public Test7(String f, String g)
      {
      }
    }
    
    public class Test8
    {
      private final String f;
      private String g;
    
      public String f(){return this.f; } 
      public String g() { return this.g; } 
      public void g_$eq(String x$1) { this.g = x$1; } 
      public String getF() { return f(); } 
      public String getG() { return g(); } 
      public void setG(String x$1) { g_$eq(x$1); }
    
    
      public Test8(@BeanProperty String f, @BeanProperty String g)
      {
      }
    }
    
    public class Test9
    {
      public Test9(@BeanProperty String f, @BeanProperty String g)
      {
      }
    }

    總結

主構造器參數 生成的字段 生成的方法
name:String 不生成任何字段 不生成任何方法
val/var name:String 私有字段 公共的getter/setter方法
private val/var name:String 私有字段 私有的getter/setter方法
private[this] val/var name:String 不生成任何字段 不生成任何方法
@BeanProperty val/var name:String 私有字段 公共的Scala版和JavaBean版的 getter/setter方法
@BeanProperty private[this] val/var name:String 不生成任何字段 不生成任何方法
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章