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);
}
相关文章
相关标签/搜索