跳转至

科特林沉降器和吸气剂

原文:https://www.geeksforgeeks.org/kotlin-setters-and-getters/

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

属性的语法

var <propertyName>[: <PropertyType>] [= <property_initializer>]
    [<getter>]
    [<setter>]

这里,属性初始化器获取器设置器是可选的。我们也可以省略属性类型,如果可以从初始值中推断出来的话。只读不可变属性声明的语法在两个方面不同于可变属性声明:

  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' 赋值,但是它显示了一个编译时错误,因为它不能接受更改。

沉降器和吸气剂

在科特林中,设置器用于设置任意变量的值,而获取器用于获取值。Getters 和 Setters 在代码中自动生成。让我们定义一个属性“名称”,在一个类中,公司名称的数据类型是字符串,我们将用一些默认值初始化

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

上面的代码相当于这个代码:

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

我们实例化了类“公司{…}”的对象“c”。当我们初始化“名称”属性时,它被传递给设置器的参数值,并将“字段”设置为值。当我们试图访问对象的名称属性时,我们得到字段是因为这个代码 get() =字段。我们可以获取使用点(。)符号**

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

默认设置器和获取器的 Kotlin 程序

我的锅

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

输出:

GeeksforGeeks

值和字段标识符

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

  • 值:按照惯例,我们选择 setter 参数的名称作为,但如果我们愿意,也可以选择不同的名称。值参数包含属性被赋予的值。在上面的程序中,我们已经将属性名初始化为c . name=“GeeksforGeeks”,值参数包含赋值的值“geeks forgeeks”。
  • 后备字段(field): 允许将属性值尽可能存储在内存中。当我们用一个值初始化一个属性时,的初始化值被写入该属性的后台字段。在上述程序中,被分配给字段,,然后,字段被分配给 get()

私人修饰词

如果我们希望在公共访问中获得方法,我们可以编写以下代码:

var name: String = ""
    private set

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

我的锅

class Company () {
    var name: String = "abc"
        private set

    fun myfunc(n: String) {
        name = n             // we set the name here
    }
}

fun main(args: Array<String>) {
    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。首先实例化类 Company()的一个对象,并使用 ${c.name} 访问属性名。然后,我们在类内部定义的函数中传递名称“GeeksforGeeks”作为参数。名称属性用新名称更新,并再次访问。

自定义设置器和获取器

我的锅

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<String>) {

    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

我们一直在努力

apachecn/AiLearning

【布客】中文翻译组