快學Scala第五章習題答案
阿新 • • 發佈:2018-12-25
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
}