1. 程式人生 > >快學Scala第五章習題答案

快學Scala第五章習題答案

5.1 改進5.1節的Counter類,讓它不要在Int.MaxValue時變成負數。

class Counter{
    private var value = Int.MaxValue
    def increment(){
      if(value < Int.MaxValue)value +=1
      else value
    }
    def current = value
}

5.2編寫一個BankAccount類,加入deposit和withdraw方法,和一個只讀的balance屬性。

class BankAccount(val balance:Int = 0)
{
//只讀 def deposit(){} def withdraw(){} }

5.3便攜一個Time類,加入只讀屬性hours和minutes,和一個檢查某一時刻是否早於另一時刻的方法

  // before(other:Time):Boolean。 Time物件應該以new Times(hrs, min)方式構建,其中hrs小時以
  //  軍用時間格式呈現
  class Time(val hours:Int,val minutes:Int ){
    def before(other:Time):Boolean={
      hours < other.hours || (hours == other.hours && minutes < other.minutes )
    }
    override
def toString():String = { hours + " : " + minutes } }

5.4 重新實現前一個練習中的Time類,將內部呈現改成自午夜起的分鐘數(介於0-24*60-1)之間。不要改變公有介面。

也就是說,客戶端程式碼不應受到你的修改而受到影響

  class Time2(val hours:Int,val minutes:Int){
    def before(other:Time2):Boolean={
      hours*60 + minutes < other.hours*60 + other.minutes
    }
    override def toString()
:String = { (hours * 60 + minutes).toString } }

5.5 建立一個Student類,加入可讀寫的JavaBeans屬性name(型別為String)和id(型別為Long).

有哪些方法被生成?(javap檢視)你可以在Scala中呼叫JavaBeans版的getter和setter方法嗎?應該這樣做嗎?

import scala.reflect.BeanProperty//???
//還是
import scala.beans.BeanProperty
class Stdudent{
  @BeanProperty var name:String = _
  @BeanProperty var id:Long = _
}

5.6 在5.2節的Person類中提供一個主構造器,將負年齡轉換為0

  class Person3(var age:Int){
    age = if(age < 0) 0 else age
  }

5.7 編寫一個Person類,其主構造器接受一個字串,該字串包含名字,空格和姓,如new Person(“Fred Smith”)

提供只讀屬性firstName 和 lastName。主構造器引數應該是var val 還是普通引數呢?為什麼?

  class Person7(val name:String){
    val firstName:String = name.split(" ")(0)
    val lastName:String = name.split(" ")(1)
  }

5.8 建立一個Car類,以只讀屬性對應制造商,型號名稱,型號年份以及一個可讀寫的屬性用於車牌。

// 提供四組構造器,每個構造器fc都要求製造商和型號為必填。型號年份和車牌可選。如果未填,則型號年份為-1,
車牌為空串。你會選擇哪個作為你的主構造器?為什麼?

  class Car(val maker:String,val typeName:String,val year:Int = -1,var varLice:String=""){

  }

5.9 用Java,C#,C++重做前一個練習

5.10 考慮如下的類:

  class Employee(val name:String, var salary:Double){
    def this(){
      this("John Q. Public",0.0)
    }
  }

//重寫該類,使用顯式的欄位定義,和一個預設主構造器。你更傾向於使用哪種形式?為什麼?

  class Employee2{
    val name:String = "John Q. Public"
    var salary:Double = 0.0
  }