iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 15
0

簡介

今天要介紹一些關於在kotlin中使用建構式與getter、setter用法,十分常見又基本。

1.class的建構式及init用法

  • 可以把class類別理解成食譜,將它實例化的時候就是將這道菜做出來的時候。
fun main(args:Array<String>){
    //透過呼叫Dog建構式來實例化成myDog物件
    val myDog = Dog("Sam",52)
}

//在建構式直接定義好name與weight等各項"屬性",供呼叫者客製化輸入,
//畢竟每隻狗名字都不同,體重也不同。
class Dog(val name:String,val weight:Int){ 

    //在類別內部才定義的activities屬性。
    //因為不管是什麼狗,都會有散步這項activities,這是不變的,所以寫在內部即可。
    var activities = arrayOf("walk")

    //此為一個初始化區塊 在這個類別Dog被實例化(初始化)的時候會執行
    init {
        println("Dog $name has been created.")
    }
}
  • 初始化是啥?
class Dog(val name:String,val weight:Int){ 
    
    var activities = arrayOf("walk")
    var age:Int   //age屬性沒有初始化,程式無法編譯!!!!
    lateinit var color:String  //用lateinit就可以先不用給值,但似乎只適用於String,其他如byte、Int、Long、boolean都不行
}

我們知道在函式中宣告的變數都必須先初始化,而在類別中定義屬性也一樣,必須將他們初始化,也就是給他們值啦

2.自訂getter與setter

  • 自訂getter:
class Dog(val name:String,val weight:Int){
    
    val weightInKgs:Double
        get() = weight/2.2

}

加入一個weightInKgs屬性與一個getter,來將體重換算成公斤。

  • 自訂setter:
class Dog(val name:String,weight_param:Int){
    
    var weight = weight_param
        set(value){
           if(value>0) field = value
        }

}

1.將weight屬性的定義從建構式移到類別裡面
2.這個setter將會在你試著設定weight值的時候被呼叫,例如:

myDog.weight = 75

3.此時會將75傳給setter的value去驗證是否大於0
4.在getter與setter裡用field來取代原屬性名稱(取代weight)可以防止你進入無窮迴圈。

  • 為什麼要設定setter與getter?
  1. 避免人們直接存取屬性值,而將屬性包在getter與setter裡的用法稱為資料隱藏(data hiding)
  2. 編寫自訂getter與setter可以保護屬性,避免被濫用。getter可以控制回傳的值,setter可以驗證值。
  3. 平常若是用val定義的變數,編譯器會在幕後幫你加入getter,若是用var定義的屬性,編譯器會在幕後幫你加入getter與setter。例如:
var name:String

當程式碼被編譯時,編譯器會私底下加入getter與setter:

var name:String
    get() = field
    
    set(value){
        field = field
    }

上一篇
Kotlin : Any類別、資料類別、具名引數、多載函式
下一篇
Kotlin : kotlin中的object用法
系列文
Android Kotlin開發 -小嫩雞的30篇精選筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
阿沁
iT邦新手 3 級 ‧ 2022-04-30 21:59:26

謝謝你寫這篇文章,解決我這個小白看英文不太懂的部分?

我要留言

立即登入留言