1. In previous chapters, we put the spotlight on functional (immutable) objects
在前面的章节,我们把焦点放在了函数式对象上
We did so because the idea of objects without any mutable state deserves to
be better known
函数式对象更容易被理解,它永远只有一种状态
However, it is also perfectly possible to define objects with
mutable state in Scala. Such stateful objects often come up naturally when
you want to model objects in the real world that change over time
也可以定义状态随时间变化的对象来模拟现实中状态随时间变化的事物
package chapter18 class BankAccount { private var bal: Int = 0 def balance: Int = bal def deposit(amount: Int) = { require(amount > 0) bal += amount } def withdraw(amount: Int): Boolean = { if (amount > bal) false else { bal -= amount true } } }
状态可变的对象通常和var一起出现,但这也不是绝对的
2. Getter和Setter
You can perform two fundamental operations on a reassignable variable: get
its value or set it to a new value. In libraries such as JavaBeans, these operations are often encapsulated in separate getter and setter methods, which
need to be defined explicitly. In Scala, every var that is a non-private member of some object implicitly defines a getter and a setter method with it.
These getters and setters are named differently from the Java convention,
however. The getter of a var x is just named “x”, while its setter is named
“x_=”.
对象中每一个非私有的var都隐式地定义getter和setter方法
class Time { var hour = 12 var minute = 0 }
编译器将上面的Time类翻译为:
class Time { private[this] var h = 12 private[this] var m = 0 def hour: Int = h def hour_=(x: Int) { h = x } def minute: Int = m def minute_=(x: Int) { m = x } } val t = new Time t.hour = 13 // 自动调用 hour_= 方法 t.minute = 30 // 自动调用 minute_= 方法 println(t.hour + ":" + t.minute)
如果需要对传入setter的值做check,可以手动定义getter和setter
class Time { private[this] var h = 12 private[this] var m = 0 def hour: Int = h def hour_=(x: Int) { require(0 <= x && x <= 24) h = x } def minute: Int = m def minute_=(x: Int) { require(0 <= x && x <= 60) m = x } }
It is also possible, and sometimes useful, to define a getter and a setter without an associated field
定义不与某个filed关联的getter和setter
class Thermometer { var celsius: Float = _ def fahrenheit = celsius * 9 / 5 + 32 def fahrenheit_=(f: Float) = { celsius = (f - 32) * 5 / 9 } }
这个例子中 celsius的getter和setter是自动产生的, fahrenheit 只有gegger和setter没有field
3. 离散事件模拟
原书406页,很有意思的例子,留到以后欣赏