2016-10-25 3 views
2

JSONオブジェクトのStringフィールドから変換するために、これらのEnumクラスのすべてに対して簡単なコードを設定したいというEnumクラスのグループが5つ以上あります。Enumクラスのグループ全体でString to Enum値の再利用可能な変換を書き込むにはどうすればよいですか? (Kotlin)

enum class Religiousness(val jsonStr: String, val resID: Int) { 
    NotAtAll("none", R.string.not_religious), 
    Somewhat("somewhat", R.string.somewhat_religious), 
    Very("very", R.string.very_religious), 
    ; 
    override fun toString() = jsonStr 
    fun displayString(res: Resources) = res.getString(resID) 
} 

私はこの

fun JsonConvertStrToEnum(enumClass: Class<Enum<*>>, str: String): Enum<*> { 
    for (enumval in enumClass.enumConstants) { 
     if ((enumval as IJsonStringConvertible).jsonStr() == str) 
      return enumval 
    } 
    throw IllegalArgumentException("Gave an invalid enum value for class ${enumClass.canonicalName}") 
} 

私はIJsonStringConvertibleが働くことができるかどうかを考え出す苦労していますし、その定義がどうなるか、そして、それを実装する方法のようなコードを書くことができるようにしたいですEnum値のインスタンス何かアドバイス?

更新:これでコンバータが作成されました。これが最善の方法ですか?戻り値がパラメータのサブタイプなので、戻り値をキャストする必要はありません。そのような

fun JsonConvertStrToEnum(enumClass: Class<out Enum<*>>, str: String): Enum<*> { 
    for (enumval in enumClass.enumConstants) { 
     if (enumval.toString() == str) 
      return enumval 
    } 
    throw IllegalArgumentException("Gave an invalid enum value for class ${enumClass.canonicalName}") 
} 
+0

== str) '? –

+0

これは本当です。私がtoStringをこのようにオーバーライドすることを決定している限り、私は 'JsonStringConvertible'などを使用する必要はありません。 – user3175580

+0

こんにちは、あなたのアップデートを見ました。何とかあなたを助けることができるニース。あなたの更新された質問によれば、ここで 'class'パラメータからジェネリック型を返す方法を調べることができます:http://stackoverflow.com/questions/34122450/how-to-get-type-in​​fo-for-a-generic -parameter –

答えて

2

列挙型は、他のクラスが実装できるようインターフェース:

interface IJsonStringConvertible { 
    val jsonStr:String 
} 

enum class Religiousness(override val jsonStr: String, val resID: Int) : IJsonStringConvertible { 
    NotAtAll("none", R.string.not_religious), 
    Somewhat("somewhat", R.string.somewhat_religious), 
    Very("very", R.string.very_religious), 
    ; 

    override fun toString() = jsonStr 
    fun displayString(res: Resources) = res.getString(resID) 
} 

その後、として使用されます:上記の検索は高価なことができますしかし、何百万ものを使用した場合(

for (enumval in enumClass.enumConstants) { 
    if ((enumval as IJsonStringConvertible).jsonStr == str) 
     return enumval 
} 

回)。より効率的に行う方法については、at the reverse lookup questionをご覧ください。

+0

ありがとうございます。私はここでほとんどの方法を得た。私はReligousnessコンストラクタで 'val jsonStr:String'を持っていました。エラー "'jsonStr'はスーパータイプのメンバーを隠しています..."なぜそれが 'override'修飾子を必要とするのか不明です。私は、「オーバーライド」が必要であったということだけを離していたと思います。ちなみに浮動関数を取り除いてクラスエクステンションなんて書いてもらう方法はありますか? – user3175580

+0

@ user3175580「浮動関数」とはどういう意味ですか? – miensol

0

それが誰を助けている場合、ここでの最終版だ、私はそれは多分うまくいくと思う:)

)多分愚かな質問申し訳ありませんが、何(enumval.toString(場合 `使用に問題がある
fun <EnumT : Enum<EnumT>> ConvertStrToEnum(enumClass: Class<EnumT>, str: String?): EnumT? { 
    if (str == null) 
     return null 
    for (enumval in enumClass.enumConstants) { 
     if (enumval.toString() == str) 
      return enumval 
    } 
    throw IllegalArgumentException("Gave an invalid enum value for class ${enumClass.canonicalName}") 
} 

fun <EnumT : Enum<EnumT> > ConvertStrArrayToEnumSet(enumClass: Class<EnumT>, array: List<String>?) : EnumSet<EnumT> { 
    val set = EnumSet.noneOf(enumClass) 
    array?.forEach { value -> set.add(ConvertStrToEnum(enumClass, value)) } 
    return set 
} 
関連する問題