【Scala】之 处理对象

Scala 处理对象


(1)类与构造器

// Car.java

public class Car {
    private final int year;
    private int miles;
    
    public Car(int yearOfMake) {year = yearOfMake; }
    
    public int getYear() { return year; }
    public int getMiles() { return miles; }
    
    public void drive(int distance) {
        miles += Math.abs(distance);
    }
}

// UseCar.scala

class Car(val year: Int) {
  private var milesDriven: Int = 0
  
  def miles: Int = milesDriven
  
  def drive(distance: Int): Unit = {
    milesDriven += Math.abs(distance)
  }
}

在 scala 中,类构造器的参数定义了字段,并自动生成了访问器方法。

即:class Car(val year: Int) 相当于 Java 的 private final int year

同时,默认:var position: String = __ 下划线表示相应的默认值
Int 默认值 0,Double 默认值 0.0, 引用类型 默认值 null



(2)遵循 JavaBean 惯例

Scala 编译器默认生成的访问器并不遵循 JavaBean 方法的命名规范。

即使用 @BeanProperty

class Dude(@BeanProperty val fistName: String, val lastName: String) {
  @BeanProperty var position: String = __
}

这样Scala会创建访问器方法 getFirstName() getPosition() setPosition()

可以通过下面命令来查看:

scalac Dude.scala
javap -private Dude


(3)类型别名

使用别名: 类名要么太长要么不灵巧,或者有更好的名字

// WorkingWithObjects/PoliceOfficer.scala
class PoliceOfficer (val name: String)

// WorkingWithObjects/CopApp.scala
object CopApp extends App {
  type Cop = PoliceOfficer
  
  val topCop = new Cop("Jack")
  println(topCop.getClass)
}

别名只是在这个文件的作用域有效

例如,Set就是一个别名,它指向 immutable 包中的 Set 版本,而不是 mutable 包中的版本



(4)参数化类型

def echo[T](input1: T, input2: T): Unit = 
  println(s"got $input1 (${input1.getClass}) $input2 (${input2.getClass})")

[T] 表示一个参数化类型

在 Java 中 <> 指定泛型,Scala 则用 [] 代替

Tips:
Scala 的所有类型都派生自 Any



(5)单例对象

单例指的是只有一个实例的类。

// 类 
class Marker(val color: String) {
  println(s"Createing ${this}")
  
  override def toString = s"marker color $color"
}

// 单例
object MarkerFactory {
  private val markers = mutable.Map (
    "red" -> new Marker("red"),
    "blue" -> new Marker("blue"),
    "yellow" -> new Marker("yellow"))
    
  def getMarker(color: String): Marker = 
    markers.getOrElseUpdate(color, new Marker(color))
}


(6)伴生对象

可以选择将一个单例关联到一个类。
这样的单例,其名字和对应类的名字一致,因此被称为伴生对象(companion object)

class Marker private (val color: String) {
  println(s"Creating ${this}")
  
  override def toString = s"marker color $color"
}

object Marker {
    private val markers = mutable.Map (
    "red" -> new Marker("red"),
    "blue" -> new Marker("blue"),
    "yellow" -> new Marker("yellow"))
    
  def getMarker(color: String): Marker = 
    markers.getOrElseUpdate(color, new Marker(color))
}

Marker 的构造器 被声明为private, 它的伴生对象可以访问它



(6)包对象

如果你发现自己创建一个类,仅仅是为了保留在同一个包中的其他类之间共享的一组方法
那么包对象就能避免创建并重复引用这样一个额外的类的负担。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值