Kotlin / Java ใช้ enum ในคำสั่ง switch ประเภท Int

Oct 02 2020

สำหรับโครงการ Android ฉันมีไฟล์. kt:

class foo () {
    enum class animal (var Id: Int) {
        CAT(0),
        DOG(1),
        FISH(2),
    }
}

และไฟล์. java ที่เกิดปัญหา:

public void processAnimal(int animalId) {
    switch(animalId) {
        case foo.animal.CAT.Id:
            //do something
            break;
        case foo.animal.DOG.Id:
            //do something else
            break;
        case foo.animal.FISH.Id:
            //do something fishy
            break;
    }
}

ในการ.Idที่จะช่วยให้เกิดข้อผิดพลาด 'Id มีการเข้าถึงเอกชนใน foo.animal' เพื่อให้ไม่ทำงาน

การเปลี่ยน.Idเป็น.getId()ให้ 'นิพจน์คงที่จำเป็น' เนื่องจากคำสั่ง switch

มันเป็นความต้องการออกจากการควบคุมของฉันสำหรับประเภทที่จะเป็นผู้intแทนanimalในลายเซ็นpublic void processAnimal(int animalId) {และนี่จะเป็นวิธีที่ถูกต้องถ้ามันไม่ได้ออกจากการควบคุมของฉัน

การทำเครื่องหมายฟิลด์เป็นสาธารณะในไฟล์. kt ไม่เปลี่ยนแปลงอะไร

มีวิธีที่จะบรรลุสิ่งที่ฉันกำหนดจะทำหรือไม่?

ขอขอบคุณ!

คำตอบ

4 Alex.T Oct 02 2020 at 14:18

วิธีเดียวที่ฉันคิดได้ในการทำงานนี้ (เนื่องจากข้อ จำกัด ของสวิตช์ java) คือการสร้างฟังก์ชันตัวช่วยในคลาส enum ซึ่งจะช่วยให้เราแปลสิ่งนั้นIdเป็น enum Valueได้

ฟังก์ชัน java จะเป็น:

public void processAnimal(int animalId) {
    AnimalEnum animalEnum = AnimalEnum.fromInt(animalId);
    switch(animalEnum) {
        case CAT:
            //do something
            break;
        case DOG:
            //do something else
            break;
        case FISH:
            //do something fishy
            break;
    }
}

และคลาส enum จะมีลักษณะดังนี้:

enum class AnimalEnum(val Id: Int) { //classes should start with an uppercase letter in kotlin
CAT(0),
DOG(1),
FISH(2);

companion object {
    @JvmStatic //to be accessible from java
    fun fromInt(givenInt: Int): AnimalEnum {
        return when (givenInt) {
            CAT.Id -> CAT
            DOG.Id -> DOG
            FISH.Id -> FISH
            else -> throw Exception("Invalid id `$givenInt`, available ids are ${values().map { it.Id }}") // or a null or something
        }
    }
}}

อีกวิธีหนึ่งในการเขียนฟังก์ชัน fromInt () คือ:

companion object {
    private val map = values().associateBy(AnimalEnum::Id)
    @JvmStatic //to be accessible from java
    fun fromInt(givenInt: Int) = map[givenInt] ?: throw Exception("Invalid id `$givenInt`, available ids are ${values().map { it.Id }}") // or a null or something
}

ตัวเลือกที่สองไม่สามารถอ่านได้ แต่จะดีกว่าถ้าเรามีค่า enum มาก