從數據的角度:封裝 (encapsulation) 就是把抽象出的數據和對數據的操做封裝在一塊兒,數據被保護在內部,程序的其它部分只有經過被受權的操做(成員方法),才能對數據進行操做安全
從模塊的角度:封裝就是將須要重複使用的邏輯封裝成共有的模塊,提升開發效率,減小重複性編碼ide
隱藏實現細節this
既能夠對數據進行驗證,又保證數據的安全合理編碼
將屬性進行私有化spa
提供一個公共的 set
方法,用於對屬性判斷並賦值scala
Java 和 Scala 提供的訪問權限修飾符code
def setXxx(參數名 : 類型) : Unit = {
//加入數據驗證的業務邏輯
屬性 = 參數名
}
複製代碼
get
方法,用於獲取屬性的值def getXxx() [: 返回類型] = {
return 屬性
}
複製代碼
建立一個員工類,對其必要屬性進行私有化,並限制年齡只能爲 [0,120]
對象
object StuffDemo {
def main(args: Array[String]): Unit = {
val stuff = new Stuff(sex = 'M')
println(stuff) // Stuff(2000.0, 18, M)
stuff.setAge(24)
println(stuff) // Stuff(2000.0, 24, M)
stuff.setAge(190)
println(stuff) // Stuff(2000.0, 24, M)
}
}
/** * 能夠在主構造器中定義屬性的默認值,甚至是設置屬性的訪問權限,可是失去了對屬性的控制(解決方式是能夠在調用構造方法前對設置的屬性進行驗證) * * @param salary * @param age * @param sex */
class Stuff(private var salary: Double = 2000, val sex: Char) {
private var age: Int = 18
def setAge(age: Int): Unit = {
if (age >= 0 && age <= 120) {
this.age = age
}
}
override def toString = s"Stuff($salary, $age, $sex)"
}
複製代碼
Scala
中爲了簡化代碼的開發,在類中聲明屬性時,自動提供對應的 setter/getter
方法(方法名爲 屬性名_&eq/屬性名
);若是屬性訪問權限聲明爲 private
,對應 setter/getter
方法的訪問權限是 private
;若是屬性聲明省略訪問權限(編譯器會自動爲其加上 public
訪問權限),對應 setter/getter
方法的訪問權限是 private
set 和 get
,只須要聲明該屬性便可;訪問屬性直接使用 對象.屬性
便可(實質上是調用編譯器自動生成的 getter
方法);設置屬性直接使用 對象.屬性=xxx
便可(實質上是調用編譯器自動生成的 setter
方法)