2017-01-04 9 views
1

値を使用してenumを取得しようとしていますが、No enum constantというエラーがスローされます。例えば、コードはKotlinにありますが、Javaで同じです。事前に感謝します。その値を使用してenum定数を取得します。

import java.util.* 

enum class TaskAction constructor(val value: String) { 
    ARCHIVE("Archive"), UN_FLAG("Un flag"), FLAG("Flag"), REDO("Redo"), 
    READY("Ready"), EDIT("Edit"), DND("dnd"), DELETE("Delete"), 
    IN_PROGRESS("In progress"), DONE("Done"); 
} 


fun main(args: Array<String>) { 
    showSomeThing(TaskAction.UN_FLAG.value) 
} 

fun showSomeThing(enum: String) { 
    println(TaskAction.valueOf(enum)) 
} 

ログ:

例外スレッド "メイン" java.lang.IllegalArgumentExceptionが中:いいえ列挙 定数TaskAction.Unフラグ

+0

「コードはKotlinにありますが、Javaでは同じです " - * Javaでは何が同じですか?さらに多くの人々がKotlinよりもJavaを書くことを考えれば、私はKotlinよりJavaの質問を書くことを強く勧めます。 –

+0

'constructor'を省略することもあります。これを確認して比較してください:https://kotlinlang.org/docs/reference/enum-classes.html –

+0

http://stackoverflow.com/a/1080914/2392960 – Januson

答えて

3

valueOf方法は対応していなければならない文字列を取りenum定数の名前。ただし、列挙型の値を抽出して、それを定数にマップすることを試みます。値が定数の名前と等しい場合を除き、これは機能しません。

したがって、問題はTaskAction.UN_FLAG.valueです。"Un flag"です。次に、TaskAction.valueOf("Un flag")を呼び出します。これは、(列挙定数の名前がUN_FLAGなので)指定した文字列で列挙定数を見つけることができません。そこで、基本的

"Un flag" != "UN_FLAG"

編集:

は、問題を解決するには、私は値に基づいて正しい列挙型を見つけた関数を作成します。私はTaskActionのコンパニオンオブジェクト内に関数を配置します。このように:

companion object { 
    fun from(s: String): TaskAction? = values().find { it.value == s } 
} 
+0

ありがとう@marstran私は '' Unflags '!= "UN_FLAG" 'を知っています。私は解決策を求めていない。 –

+1

@SaiKiran編集を参照してください。 – marstran

3

私の列挙型クラスを以下のように変更しました。私は静的マップを追加しました。値と名前をそれ自身でマップする方法はないからです。これがいくつか役に立ったと思った。

enum class TaskAction constructor(val value: String) { 
    ARCHIVE("Archive"), UN_FLAG("Un flag"), FLAG("Flag"), REDO("Redo"), 
    READY("Ready"), EDIT("Edit"), DND("dnd"), DELETE("Delete"), 
    IN_PROGRESS("In progress"), DONE("Done"); 

    companion object { 
     private val lookup = HashMap<String, TaskAction>() 

     init { 
      TaskAction.values().map { lookup.put(it.value, it) } 
     } 

     fun getFromValue(value: String):TaskAction { 
      return lookup[value]!! 
     } 
    } 
} 

更新:

感謝@ mfulton26に私は私のコードを簡素化:

enum class TaskAction constructor(val value: String) { 
    ARCHIVE("Archive"), UN_FLAG("Un flag"), FLAG("Flag"), REDO("Redo"), 
    READY("Ready"), EDIT("Edit"), DND("dnd"), DELETE("Delete"), 
    IN_PROGRESS("In progress"), DONE("Done"); 

    companion object { 
     private val lookup = values().associateBy(TaskAction::value) 
     fun fromValue(value: String):TaskAction = requireNotNull(lookup[value]) { "No TaskAction with value $value" } 
    } 
} 

私も@marstranの助けを借りにコードを減らす:

companion object { 
    fun from(search: String): TaskAction = requireNotNull(values().find { it.value == search }) { "No TaskAction with value $search" } 
} 
+2

1. 'fromValue'は' getFromValue'よりも良い名前です。 2. 'lookup'は単に' private val lookup = values()。associateBy(TaskAction :: value) 'として初期化することができます。 3. 'KotlinNullPointerException'の代わりに' IllegalArgumentException'をスローしたいかもしれません。例えば'return requireNotNull(lookup [value]){"値$ value "}"のTaskActionはありません。 – mfulton26

関連する問題