Kotlin Setter 和 Getter
属性是任何编程语言的重要组成部分。在 Kotlin 中,我们可以像声明另一个变量一样定义属性。 Kotlin 属性可以使用var关键字声明为可变的,也可以使用val关键字声明为不可变的。
属性语法
var [: ] [= ]
[]
[]
在这里,属性initializer 、 getter和setter是可选的。如果可以从初始化程序中推断出来,我们也可以省略属性type 。只读或不可变属性声明的语法在两个方面与可变属性声明不同:
- 它以val而不是var开头。
- 它不允许设置器。
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