首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin Enums:引用任何Enum对象的函数

Kotlin Enums:引用任何Enum对象的函数
EN

Stack Overflow用户
提问于 2018-08-02 20:05:19
回答 3查看 156关注 0票数 1

我正在尝试编写一个枚举函数print(),该函数可以通过枚举Molecule中的对象调用,如下所示

代码语言:javascript
复制
Molecule.HYDROGEN_MOLECULE.print()
myMolecule.print()

我不想给函数提供一个特定的Enum对象:

代码语言:javascript
复制
Molecule.print(Molecule.HYDROGEN)

但是,当我在Molecule中创建函数时,当我试图引用MolecularFragment列表时,我得到一个错误。

我需要在print()中使用什么语法才能使像myMolecule.print()这样的东西引用特定枚举对象的MolecularFragment列表?

代码语言:javascript
复制
enum class Molecule (val MolecularFragments : List<MolecularFragment> = emptyList()) {

    HYDROGEN_MOLECULE(listOf(MolecularFragment.H2)),

    WATER_MOLECULE(listOf(MolecularFragment.H2O)),
    // ...
    HEXANE_MOLECULE(listOf(MolecularFragment.CH3, MolecularFragment.CH2));

    fun print() {

        **var x : List<MolecularFragment> = Molecule.MolecularFragments**
        x.forEach() {
            println("$it")
        }
        println(" --- ${Molecule.toString()}")
    }
}
EN

回答 3

Stack Overflow用户

发布于 2018-08-02 22:54:36

我猜这就是你想要的:

代码语言:javascript
复制
enum class MolecularFragment { H2, H2O, CH3, CH2 }

enum class Molecule (val molecularFragments : List<MolecularFragment> = emptyList()) {

    HYDROGEN_MOLECULE(listOf(MolecularFragment.H2)),

    WATER_MOLECULE(listOf(MolecularFragment.H2O)),

    HEXANE_MOLECULE(listOf(MolecularFragment.CH3, MolecularFragment.CH2));

    fun print() {
        molecularFragments.forEach(::println)
        println("${this::class.java.toString()}")
    }
}

fun main(args: Array<String>) {
    Molecule.HYDROGEN_MOLECULE.print()
}

以下是几个注意事项:

  • 用双星号突出显示的行甚至没有编译。
  • 您可以使用函数引用来打印元素。
  • 您不需要首先将属性molecularFragments放入变量中。
  • 下次,请指定< code >D10以便代码可以立即运行。
票数 1
EN

Stack Overflow用户

发布于 2018-08-02 20:23:59

我会使用类似如下的方法:

代码语言:javascript
复制
enum class MyType(val subTypes: List<String>) {

    FIRST_TYPE(listOf("one", "two")),
    SECOND_TYPE(listOf("three", "four"));
}

//Honestly his method could be moved in some util .kt file
    fun printOneType(myType: MyType) {
        myType.subTypes.forEach { print(it.toString()) }
    }

如果您在打印枚举内部集合中的子对象时遇到问题,那么可能是它们的toString()或其他util方法没有很好地实现--只是一个选择。

编辑。topic starter问题的解决方案要简单得多。无论如何,对于枚举的内部集合,您可以这样做:

代码语言:javascript
复制
enum class MyType(val otherTypes: List<OtherType>) {

    FIRST_TYPE(listOf(OtherType.FIRST)),
    SECOND_TYPE(listOf(OtherType.SECOND));
}

//Honestly his method could be moved in some util .kt file
fun printOneType(myType: MyType) {
        myType.otherTypes.forEach { print(it.name) }
    }
}
票数 0
EN

Stack Overflow用户

发布于 2018-08-02 20:35:41

正如@marstran已经在评论中指出的:从您标记的行中删除Molecule,使其看起来如下所示:

代码语言:javascript
复制
var x : List<MolecularFragment> = MolecularFragments

或者,如果您愿意:

代码语言:javascript
复制
var x : List<MolecularFragment> = this.MolecularFragments

枚举类方法访问this枚举值的值,并且不是单例或静态方法。

或者,您也可以提供一个通用的扩展函数,它允许在任何时候打印任何枚举:

代码语言:javascript
复制
fun <T : Enum<T>> Enum<T>.printIt() = toString().also(::println)

这样,您只需覆盖toString()-method,甚至可以将该toString-method用于其他目的,例如,示例覆盖:

代码语言:javascript
复制
enum class Molecule ... {
  // ...
  override fun toString(): String {
      return super.toString() + ": $molecularFragments"
  }
}

。。正如@marstran还指出的: Kotlin中最常见的代码约定是属性以小写字母开头。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51653213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档