【问题标题】:Kotlin - Understanding Getters and SettersKotlin - 了解 Getter 和 Setter
【发布时间】:2016-11-05 13:04:30
【问题描述】:

Kotlin 自动生成它的 getter 和设置,但我从不引用它们?另外,在 Kotlin 中编写自定义 getter/setter 的正确方法是什么?当我说myObj.myVar = 99 时,我觉得myVarmyObj 的公共字段,我正在直接访问?这里到底发生了什么?

【问题讨论】:

标签: kotlin


【解决方案1】:

这已经在几个地方得到了回答,但我想我会为从 Java/C#/C/C++ 过渡到 Kotlin 的人分享一个具体的例子,并且他们有同样的问题:

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

来自documentation - 声明属性的完整语法是:

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 字节码检查器,以防一些更复杂的属性相关功能,例如委托属性。
  • 对于 someStr0 prop、getter 和 setter,它们的可见性范围是什么?在此示例中,所有属性都是公共的(默认)。如果我有私有属性,这个例子会起作用吗 - 我已经习惯了成为 Java 开发人员。
  • 如何将gettersetter 用于私有变量
  • 谢谢,帮助了我。
【解决方案2】:

以下是自定义 getter 和 setter 的一些真实示例。 You can see more here.

// 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"

【讨论】:

    猜你喜欢
    • 2018-12-08
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多