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

静态编程语言enum val返回null,尽管在编译时设置

谢奇略
2023-03-14

我有一个具有多个字段的静态编程语言枚举。其中一个字段(entableBoard)是另一个枚举的值。在运行时,尽管已设置,但此val为空。

我以前从未见过这样的情况,其他字段工作正常,即使是引用当前项目的字段!我已经包含了完整的枚举定义,因为我不确定什么是相关的。

Item枚举和一个值,其中entableBoard意外为空,而不是Board.SPACEX_EARLY_TREES

enum class Item(
    val chain: ItemChain,
    val tier: Int,
    @StringRes val title: Int,
    @DrawableRes val image: Int,
    val generatorMaxEnergy: Int = 0, 
    val enterableBoard: Board? = null,
    val mergeBonus: Pair<Item, Int>? = null, 
    val redeemable: Pair<InfoLong, Int>? = null
) {
    TREE_9(ItemChain.TREE, 9, R.string.item_tree9, R.drawable.item_tree9,
        generatorMaxEnergy = 50, enterableBoard = Board.SPACEX_EARLY_TREES)
}

电路板枚举和相关值:

enum class Board(
    val campaign: Campaign,
    @StringRes val title: Int,
    @StringRes val description: Int,
    @DrawableRes val background: Int,
    @DrawableRes val image: Int,
    val unlockCost: Int,
    val template: List<Item>
) {
    SPACEX_EARLY_TREES(Campaign.SPACEX_EARLY, R.string.board_spacex_early_tree_title, R.string.board_spacex_early_tree_description,
        R.drawable.background5, R.drawable.background5, 0,
        listOf(Item.FRUITVEG_1, Item.FRUITVEG_2, Item.FRUITVEG_1))
}

这是entableBoard意外为空的截图:

附加说明:

  • 我尝试更改树9中的其他值,它们都会更新,因此包含的定义肯定就是所使用的定义
  • 尝试在代码中访问该字段时,该字段也为空
  • Kotlin版本1.5.20
  • Android Studio 2020.3.1补丁1

共有1个答案

萧和同
2023-03-14

我很确定这是因为你有一个相互的参考。董事会在其构造函数中引用项目,反之亦然。两个枚举类的成员中的一个在另一个之前实例化,因此在引用其他值时,对其他值的引用仍然为null。这是通过做一些不应该做的事情,比如从构造函数调用一个open函数,来获得对Kotlin中null的不可为null的引用(如果你的板参数不可为null,这种情况仍然会发生)。

基本上,枚举不能安全地相互引用,因为它们在实例化时是如何编译和行为的。编译器是否应该针对这种情况显示警告或错误?可能吧,但显然不是。

这里有一个问题的最小可复制示例:

enum class Item (val board: Board) {
    X(Board.Y)
}

enum class Board(val item: Item) {
    Y(Item.X)
}

fun main() {
    Item.X
    println(Board.Y.item)
}

打印null,因为引用了项。X导致首先尝试实例化项的成员,但由于其构造函数引用了Board,因此Board实际上首先实例化,并使用仍然为null的项。X参考。

 类似资料:
  • 我在我的一个项目中使用RxJava,我使用Android Studio插件将我的一个类转换为静态编程语言,并在maplambda(java中的Func1)之一中,中间体返回如下所示。 我不知道这意味着什么。

  • 我试图用OkHttp和Cucumber在静态编程语言中设置一个Spring启动项目,并且在运行Cucumber任务时遇到以下错误。如何修复? 还有build gradle kts片段 我看到了这个错误https://github.com/square/okio/issues/647看起来可能是它,并修复了这个build.gradle,我如何将其翻译为kotlinbuild.gradle.kts?

  • 我有一个注释要求是编译时常量。我从下面的中获取: 我的s如下: 当我使用注解Kotlin需要是编译时常量。 注释实现本身: 我仔细研究了类似的问题,但没有找到解决方法。我还找到了一篇与这个主题相关的文章,但到目前为止没有任何效果。 附带说明:我不能更改注释,因为它来自库,我也不能更改库。 总而言之,有没有办法从静态编程语言中的编译时常量到注释中使用?

  • 如图所示,https://stackoverflow.com/a/16639438/8949356,在Java中,当声明的类是公共类时,可以重写其函数 但是我想知道如何用静态编程语言编写完全相同的代码,我已经尝试了很多,但没有找到任何关于这个主题的东西。我可以在Java中去做这件事,但我的其余代码是用静态编程语言编写的,而且我不能一直带着这种怀疑;静态编程语言对我来说是一个很好的工具,我想学习它。

  • 上周我更新了Kotlin 1.5,昨天看到谷歌打算让Jetpack成为设计UI的首选选项后,我想做一些测试。 问题是将我的项目更新为静态编程语言1.5,当尝试构建项目时,我得到以下错误: 静态编程语言1.5与Jetpack Compose不兼容吗?在谷歌搜索问题后,我找到了版本,其中提到了Jetpack Compose,但不是以“不兼容”的方式。 你对此有任何答案吗?我应该使用吗?在这种情况下,我

  • 我的项目中有这个错误。但是,找不到任何地方如何解决它。有人有这个问题吗? 它会导致每次都重新运行构建。 使用静态编程语言编译守护程序不成功 无法连接到kotlin守护程序。使用回退策略。