Enums Kotlin Enum:引用它所属的任何Enum对象的函数';他是从哪里打来的

Enums Kotlin Enum:引用它所属的任何Enum对象的函数';他是从哪里打来的,enums,kotlin,Enums,Kotlin,我正在尝试编写一个enum函数print(),它可以从enummolecular中的一个对象按如下方式调用: Molecule.HYDROGEN_MOLECULE.print() myMolecule.print() 我不想为函数提供特定的枚举对象: Molecule.print(Molecule.HYDROGEN) 但是,当我在molecular中创建函数时,当我尝试引用MolecularFragment的列表时,我得到了一个错误 我需要在print()中使用什么语法来生成类似于mymol

我正在尝试编写一个enum函数
print()
,它可以从enum
molecular
中的一个对象按如下方式调用:

Molecule.HYDROGEN_MOLECULE.print()
myMolecule.print()
我不想为函数提供特定的枚举对象:

Molecule.print(Molecule.HYDROGEN)
但是,当我在
molecular
中创建函数时,当我尝试引用
MolecularFragment
的列表时,我得到了一个错误

我需要在print()中使用什么语法来生成类似于
mymolecular.print()
的内容,以引用特定枚举对象的
MolecularFragment
列表

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()}")
    }
}
枚举类分子(val MolecularFragments:List=emptyList()){ 氢分子(listOf(MolecularFragment.H2)), 水分子(listOf(MolecularFragment.H2O)), // ... 己烷_分子(列表(MolecularFragment.CH3,MolecularFragment.CH2)); 趣味印刷品(){ **var x:List=分子。分子碎片** x、 forEach(){ println(“$it”) } println(“--${Molecule.toString()}”) } }
我会使用类似的方法:

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()) }
    }

正如@marstran在评论中指出的:从标记的行中删除
分子
,使其看起来像:

var x : List<MolecularFragment> = MolecularFragments
这样,您只需重写
toString()
-方法,甚至可以将该
toString
-方法重新用于其他目的,例如示例重写:

enum class Molecule ... {
  // ...
  override fun toString(): String {
      return super.toString() + ": $molecularFragments"
  }
}

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

我想这正是您想要的:

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()
}
enum类分子碎片{H2,H2O,CH3,CH2}
枚举类分子(val molecularFragments:List=emptyList()){
氢分子(listOf(MolecularFragment.H2)),
水分子(listOf(MolecularFragment.H2O)),
己烷_分子(列表(MolecularFragment.CH3,MolecularFragment.CH2));
趣味印刷品(){
分子碎片。forEach(::println)
println(“${this::class.java.toString()}”)
}
}
趣味主线(args:Array){
Molecule.HYDROGEN_Molecule.print()
}
几点注意:

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

只需写入
var x:List=MolecularFragments
。顺便说一句,Kotlin中的约定是用小写字母命名属性。像
molecularFragments
。想像enum类方法就像想像普通类方法一样。您的对象(在枚举中:您的枚举常量)使用
this
访问每个字段/属性。这似乎是OP最初不想要的。您的第一个方法
printAll
应该是一个静态变量(伴生对象的方法),而不是成员方法。后者应该如下所示:
fun print()=子类型。forEach(::println)
使用
FIRST\u TYPE.print()
调用它,而不是
FIRST\u TYPE.printOneType(SECOND\u TYPE)
,这没有多大意义。是的,我意识到了这一点,并做了一些补充:也许将来会有人需要像这样简单的语法。我不认为你明白我的意思。您的
printOneType
-方法是一个成员函数,可以调用
FIRST\u TYPE.printOneType(SECOND\u TYPE)
,这真的没有意义。这就是为什么我评论说像这样的方法应该移动到某个util.kt文件或类中。对不起,这也没有多大意义。如果您真的想要这样一个方法,您可能会将它放在enum的
伴生对象中。但是,打印单个枚举应该是该枚举本身的一个成员函数。谢谢,我也尝试了与您的解决方案类似的语法,但也没有编译它。我很感激。
fun <T : Enum<T>> Enum<T>.printIt() = toString().also(::println)
enum class Molecule ... {
  // ...
  override fun toString(): String {
      return super.toString() + ": $molecularFragments"
  }
}
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()
}