当前位置: 首页 > 知识库问答 >
问题:

Kotlin-了解getter和setter

红智鑫
2023-03-14

Kotlin自动生成它的getters和settings,但是我从来没有引用过它们?另外,用Kotlin编写自定义getter/setter的正确方法是什么?当我说< code>myObj.myVar = 99时,我感觉< code>myVar是我正在直接访问的< code>myObj的公共字段。这里到底发生了什么?

共有2个答案

姜羽
2023-03-14

以下是一些自定义getter和setter的真实示例。您可以在此处查看更多信息。

// Custom getter example
val friendlyDescription get(): String {
    val isNeighborhood = district != null
    var description = if (isNeighborhood) "Neighborhood" else "City"
    description += " in"
    if (isNeighborhood) {
        description += " $city,"
    }
    province?.let {
        if (it.isNotEmpty()) {
            description += " $it,"
        }
    }
    description += " $country"
    return description
}

print(myLocation.friendlyDescription) // "Neighborhood in Denver, Colorado, United States"

// Custom setter example
enum class SearchResultType {
    HISTORY, SAVED, BASIC
}

private lateinit var resultTypeString: String

var resultType: SearchResultType
    get() {
        return enumValueOf(resultTypeString)
    }
    set(value) {
        resultTypeString = value.toString()
    }

result.resultType = SearchResultType.HISTORY
print(result.resultTypeString) // "HISTORY"

鲁龙野
2023-03-14

这已经在几个地方得到了回答,但我想我会分享一个具体的例子,供人们从Java /C#/C/C过渡到静态编程语言,他们有和我一样的问题:

我很难理解 getter 和 setters 在 Kotlin 中是如何工作的,特别是因为它们从未被明确调用(就像在 Java 中一样)。正因为如此,我感到不舒服,因为看起来我们只是直接将vars/vals称为字段。因此,我进行了一个小实验来证明事实并非如此,实际上,当您访问变量/值时,它是在 Kotlin 中调用的隐式(自动生成)或显式 getter/setter。不同之处在于,您没有明确要求默认的 getter/setter。

从文档中 - 声明属性的完整语法是:

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

我的例子是

class modifiersEg {

/** this will not compile unless:
 *      - we assign a default here
 *      - init it in the (or all, if multiple) constructor
 *      - insert the lateinit keyword    */
var someNum: Int?
var someStr0: String = "hello"
var someStr1: String = "hello"
    get() = field  // field is actually this.someStr1, and 'this' is your class/obj instance
    set(value) { field = value }

// kotlin actually creates the same setters and getters for someStr0
// as we explicitly created for someStr1

var someStr2: String? = "inital val"
    set(value) { field = "ignore you" }

var someStr3: String = "inital val"
    get() = "you'll never know what this var actually contains"

init {
    someNum = 0

    println(someStr2) // should print "inital val"

    someStr2 = "blah blah blah"
    println(someStr2) // should print "ignore you"

    println(someStr3) // should print "you'll never know what this var actually contains"
}

我希望这能帮助其他人把这一切结合起来?

 类似资料:
  • 如何在Kotlin中创建一个具有私有getter(或只是没有)但具有公共setter的属性? 不能使用错误: 在我的例子中,原因是Java Interop:我希望我的Java代码能够调用,但不能调用。

  • 有什么方法可以在Kotlin数据类中创建一个私有setter和一个公共getter吗?

  • 有没有更好的方法只让getters公开?

  • 在Kotlin中,< code>var是可变的,而< code>val只能赋值一次。 但是,请考虑以下示例中的< code>val foo: 每次尝试访问,都会执行方法,从而产生不同的val值。 由于< code>foo的值在变化,所以我尝试使用< code>var。然后编译器抱怨“属性必须初始化”。所以我必须给它一个默认值: 这两种方法我都不喜欢。正确的做法是什么?

  • 如何使用自定义setter声明属性,但在Kotlin中没有getter?例如,在安科,他们这样做: 但在我看来,这有点骇人。这样做对吗?如果是,那么当一个项目没有Anko依赖关系时,情况会怎样呢? 附言:让我说清楚——我想没有吸气剂,而不是私人吸气剂

  • 问题内容: 始终建议使用getter / setter访问私有变量。为什么最好将它们声明为public并对其进行访问。无论如何,我们正在使用getter和setter访问它? 问题答案: @mre的回答非常好,您的问题很重要。总结一下:您将对象的字段设置为私有,以控制其他对象使用它的方式。您的对象使用setter来: 限制和验证传递给设置器的数据 隐藏其内部数据结构(服务对其他对象感兴趣,而不是服