📜  Kotlin Setter 和 Getter

📅  最后修改于: 2022-05-13 01:54:33.620000             🧑  作者: Mango

Kotlin Setter 和 Getter

属性是任何编程语言的重要组成部分。在 Kotlin 中,我们可以像声明另一个变量一样定义属性。 Kotlin 属性可以使用var关键字声明为可变的,也可以使用val关键字声明为不可变的。

属性语法

var [: ] [= ]
    []
    []

在这里,属性initializergettersetter是可选的。如果可以从初始化程序中推断出来,我们也可以省略属性type只读不可变属性声明的语法在两个方面与可变属性声明不同:

  1. 它以val而不是var开头。
  2. 它不允许设置器。
fun main(args : Array) {
    var x: Int = 0
    val y: Int = 1
    x = 2 // In can be assigned any number of times
    y = 0 // It can not be assigned again
    }

在上面的代码中,我们试图再次为 ' y'赋值,但它显示编译时错误,因为它无法接受更改。

设置者和获取者

在 Kotlin 中, setter用于设置任何变量的值getter用于获取值。 Getter 和 Setter 是在代码中自动生成的。让我们在类“ Company ”中定义一个属性“ name ”。 ' name ' 的数据类型是 String,我们将使用一些默认值对其进行初始化

class Company {
var name: String = "Defaultvalue"
}

上面的代码等价于这段代码:

class Company {
    var name: String = "defaultvalue"
        get() = field                     // getter
        set(value) { field = value }      // setter
}

我们实例化类“Company {…}”的对象“ c ”。当我们初始化 ' name'属性时,它被传递给 setter 的参数值并将 'field' 设置为 value。当我们试图访问对象的name属性时,我们得到 field 因为这个代码get() = field 。我们可以使用dot(.) 表示法获取设置类对象的属性——

val c = Company()
c.name = "GeeksforGeeks"  // access setter
println(c.name)           // access getter (Output: GeeksforGeeks)

Kotlin 程序的默认 Setter 和 Getter

Kotlin
class Company {
    var name: String = ""
        get() = field        // getter
        set(value) {         // setter
            field = value
        }
}
fun main(args: Array) {
    val c = Company()
    c.name = "GeeksforGeeks"  // access setter
    println(c.name)           // access getter
}


Kotlin
class Company () {
    var name: String = "abc"
        private set
 
    fun myfunc(n: String) {
        name = n             // we set the name here
    }
}
 
fun main(args: Array) {
    var c = Company()
    println("Name of the company is: ${c.name}")
    c.myfunc("GeeksforGeeks")
    println("Name of the new company is: ${c.name}")
}


Kotlin
class Registration( email: String, pwd: String, age: Int , gender: Char) {
 
    var email_id: String = email
        // Custom Getter
        get() {
           return field.toLowerCase()
        }
    var password: String = pwd
        // Custom Setter
        set(value){
            field = if(value.length > 6) value else throw IllegalArgumentException("Passwords is too small")
        }
 
    var age: Int = age
        // Custom Setter
        set(value) {
            field = if(value > 18 ) value else throw IllegalArgumentException("Age must be 18+")
        }
    var gender : Char = gender
        // Custom Setter
        set (value){
            field = if(value == 'M') value else throw IllegalArgumentException("User should be male")
        }
}
 
fun main(args: Array) {
   
    val geek = Registration("PRAVEENRUHIL1993@GMAIL.COM","Geeks@123",25,'M')
 
    println("${geek.email_id}")
    geek.email_id = "GEEKSFORGEEKS@CAREERS.ORG"
    println("${geek.email_id}")
    println("${geek.password}")
    println("${geek.age}")
    println("${geek.gender}")
     
    // throw IllegalArgumentException("Passwords is too small")
    geek.password = "abc"   
     
    // throw IllegalArgumentException("Age should be 18+")
    geek.age= 5  
            
    // throw IllegalArgumentException("User should be male")
    geek.gender = 'F'        
}


输出:

GeeksforGeeks

值和字段标识符

我们在上面的程序中注意到了这两个标识符。

  • 值:通常,我们选择 setter 参数的名称为value ,但如果需要,我们可以选择不同的名称。 value 参数包含分配给属性的值。在上面的程序中,我们已经将属性名初始化为c.name = “GeeksforGeeks”, value 参数包含了赋值“GeeksforGeeks”。
  • 支持字段(field):它允许将属性值存储在内存中。当我们用一个值初始化一个属性时,初始化的值被写入该属性的支持字段。在上面的程序中,将value分配给field,然后将field分配给get()

私人修饰符

如果我们想要公共访问的get方法,我们可以编写以下代码:

var name: String = ""
    private set

而且,由于 set 访问器附近的 private 修饰符,我们只能在类内部的方法中设置名称。 Kotlin 程序通过使用类中的方法来设置值。

科特林

class Company () {
    var name: String = "abc"
        private set
 
    fun myfunc(n: String) {
        name = n             // we set the name here
    }
}
 
fun main(args: Array) {
    var c = Company()
    println("Name of the company is: ${c.name}")
    c.myfunc("GeeksforGeeks")
    println("Name of the new company is: ${c.name}")
}

输出:

Name of the company is: abc
Name of the new comapny is: GeeksforGeeks

解释:

在这里,我们使用了带有 set 的 private 修饰符。首先实例化 Company() 类的对象并使用${c.name}访问属性名称。然后,我们将名称“GeeksforGeeks”作为参数传递给类中定义的函数。 name 属性更新为新名称并再次访问。

自定义设置器和获取器

科特林

class Registration( email: String, pwd: String, age: Int , gender: Char) {
 
    var email_id: String = email
        // Custom Getter
        get() {
           return field.toLowerCase()
        }
    var password: String = pwd
        // Custom Setter
        set(value){
            field = if(value.length > 6) value else throw IllegalArgumentException("Passwords is too small")
        }
 
    var age: Int = age
        // Custom Setter
        set(value) {
            field = if(value > 18 ) value else throw IllegalArgumentException("Age must be 18+")
        }
    var gender : Char = gender
        // Custom Setter
        set (value){
            field = if(value == 'M') value else throw IllegalArgumentException("User should be male")
        }
}
 
fun main(args: Array) {
   
    val geek = Registration("PRAVEENRUHIL1993@GMAIL.COM","Geeks@123",25,'M')
 
    println("${geek.email_id}")
    geek.email_id = "GEEKSFORGEEKS@CAREERS.ORG"
    println("${geek.email_id}")
    println("${geek.password}")
    println("${geek.age}")
    println("${geek.gender}")
     
    // throw IllegalArgumentException("Passwords is too small")
    geek.password = "abc"   
     
    // throw IllegalArgumentException("Age should be 18+")
    geek.age= 5  
            
    // throw IllegalArgumentException("User should be male")
    geek.gender = 'F'        
}

输出:

praveenruhil1993@gmail.com
geeksforgeeks@careers.org
Geeks@123
25
M