var
class Person(var firstName: String, var lastName: String)
public class Person { private String firstName; private String lastName; public String firstName(); public void firstName_$eq(String firstName); public String lastName(); public void lastName_$eq(String lastName); public Person(String firstName, String lastName); }
var
自動生成了「讀寫」的接口;java
var
表示可變對象,表明了一種「命令式」的思惟;ide
val
class Person(val firstName: String, val lastName: String)
public class Person { private final String firstName; private final String lastName; public String firstName(); public String lastName(); public Person(String firstName, String lastName); }
val
只生成了「只讀」的接口;函數
val
表示不可變對象,表明了一種「函數式」的思惟;this
val
蘊含了final
的語義;scala
private
class Person(private val firstName: String, private val lastName: String)
public class Person { private final String firstName; private final String lastName; private String firstName(); private String lastName(); public Person(String firstName, String lastName); }
Scala
對字段都是private
的,即便沒有顯式地提供private
;code
Scala
的private
表示對應的「只讀」或「只寫」是private
的;對象
private[this]
Scala
的 private[this]
表示「對象私有性」,相似於Ruby
中的private
;表示只有「本對象」才能訪問,就是同類的其餘對象也不能訪問。接口
class Person(private[this] var firstName: String, private[this] val lastName: String)
public class Person { public Person(String firstName, String lastName); }
當且僅當類中的方法使用了構造器參數,才能自動生成字段;不然僅僅做爲主構造器使用的普通函數參數。get
class Person(private[this] var firstName: String, private[this] val lastName: String) { override def toString = s"Person($firstName, $lastName)" }
public class Person { private String firstName; // var private final String lastName; // val public String toString(); public Person(String firstName, String lastName); }
var/val
修飾工做機制相似於private[this] val
,當且僅當類中的方法使用了構造器參數,才能自動生成字段;不然僅僅做爲主構造器使用的普通函數參數。ast
class Person(firstName: String, lastName: String) { override def toString = s"Person($firstName, $lastName)" }
public class Person { private final String firstName; private final String lastName; public String toString(); public Person(String firstName, String lastName); }
可是,case class
經常使用無var/val
修飾的字段,但它表示val
的語義,而非private[this] val
。
case class Person(name: String)
等價於:
case class Person(val name: String)
@BeanProperty
import scala.beans.BeanProperty class Person(@BeanProperty var firstName: String)
public class Person { private String firstName; public String firstName(); public void firstName_$eq(String firstName); public void setFirstName(String firstName); public String getFirstName(); public Person(String firstName); }
@BooleanBeanProperty
import scala.beans.BooleanBeanProperty class Person(@BooleanBeanProperty val valid: Boolean)
public class Person { private final boolean valid; public boolean valid(); public boolean isValid(); public Person(boolean valid); }