Scala Essentials: 剖析 var/val

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的,即便沒有顯式地提供privatecode

  • Scalaprivate表示對應的「只讀」或「只寫」是private的;對象

private[this]

Scalaprivate[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);
}
相關文章
相關標籤/搜索