kotlin - Kotlin 是否在函数内部有类似静态变量的东西?

标签 kotlin

我想知道它是否有类似 C 函数内部静态变量的功能。

在 C 语言中我们有这样的:

void next_x()
{
    static int x = 0;
    x++;
}

变量 x 在函数内部声明和初始化。据我所知,C - 它只能在这个函数的范围内使用,并且只能在第一次调用这个函数时初始化。

我在 Kotlin 中需要这样的东西。我有类似这样的代码:

private val x: Int = 0

fun getNextX() : Int {
    x++;
    return x;
}

我想要这样的东西:

fun getNextX() : Int {
    static val x: Int = 0 // this is not Kotlin code
    x++;
    return x;
}

我想:

  1. 限制 x 变量范围以强调此对象仅由此函数使用并保护它免受外部更改
  2. 只初始化一次
  3. 在函数调用之间保持值/状态

上面的例子被简化了。事实上,对于范围有限但保留状态的 ArrayList,我需要这样的东西。

我意识到我们有单例模式,它几乎可以完美满足这种需求(除了有限的范围),但也许 Kotlin 提供了其他东西?

最佳答案

在 Kotlin 中没有类似的东西,但是为了模拟类似的效果,您可以声明一个 object 并将所有 static 变量作为属性,然后将invoke 运算符中的函数体:

object NextX {
    private var x = 0
    operator fun invoke() = x++
}

您基本上创建了一个对象,但从语法上讲,它的工作方式类似于您可以调用的函数:

fun main() {
    println(NextX()) // 0
    println(NextX()) // 1
    println(NextX()) // 2
}

如果您将整个 object 视为您的函数,那么 x 确实只能在“函数”中访问。

关于kotlin - Kotlin 是否在函数内部有类似静态变量的东西?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74524863/

相关文章:

android - react-native-webview 无法解析 org.jetbrains.kotlin :kotlin-gradle-plugin:1. 3.11

kotlin - Kotlin 与 C# 中的标志枚举变量具有相似效果的方式是什么

android - 在当前主题中找不到样式 'cardView Style'

android - Koin 单例注入(inject)带有私有(private)参数的构造函数

Kotlin 为什么尽管进行空检查仍需要非空断言

android - Kotlin 运行时错误 kotlin.Any 未找到

android - FragmentTransaction 隐藏/显示有时不起作用

android - 获取首选项在 fragment 中不起作用

android - SonarQube - Android 不适用于 gradle 3.0.0

android - Kotlin , Gradle : mixing Android and non-Android modules