特定の封印されたクラスのすべてのサブクラスを取得するにはどうすればよいですか?

glee8e:

最近、列挙型クラスの1つをサブクラスとしてオブジェクトを含むシールクラスにアップグレードしました。これにより、抽象化の別の層を作成してコードを簡略化できます。ただし、Enum.values()関数を介してすべての可能なサブクラスを取得することはできなくなりました。これは、その機能に大きく依存しているため、悪いことです。リフレクションまたは他のツールでそのような情報を取得する方法はありますか?

PS:手動でアレイに追加することはできません現在45件ありますが、さらに追加する予定です。


これは私たちの密封されたクラスがどのように見えるかです:

sealed class State

object StateA: State()
object StateB: State()
object StateC: State()
....// 42 more

値のコレクションがある場合は、次のような形になります。

val VALUES = setOf(StateA, StateB, StateC, StateC, StateD, StateE,
    StateF, StateG, StateH, StateI, StateJ, StateK, StateL, ......

当然、誰もそのようなモンスターを維持したいとは思わない。

mfulton26:

Kotlin 1.3以降では、を使用できますsealedSubclasses

以前のバージョンでは、基本クラスでサブクラスをネストすると、次のように使用できますnestedClasses

Base::class.nestedClasses

基本クラス内に他のクラスをネストする場合は、フィルタリングを追加する必要があります。例えば:

Base::class.nestedClasses.filter { it.isFinal && it.isSubclassOf(Base::class) }

これにより、サブクラスが提供され、それらのサブクラスのインスタンスは提供されないことに注意してください(とは異なりますEnum.values())。


特定の例では、ネストされたすべてのクラスStateobject状態である場合、以下を使用してすべてのインスタンス(などEnum.values()を取得できます

State::class.nestedClasses.map { it.objectInstance as State }

そして、本当に凝ったものにしたい場合はEnum<E: Enum<E>>リフレクションを使用して、独自のクラス階層をそこから具体的なオブジェクトに拡張および作成することもできます例えば:

sealed class State(name: String, ordinal: Int) : Enum<State>(name, ordinal) {
    companion object {
        @JvmStatic private val map = State::class.nestedClasses
                .filter { klass -> klass.isSubclassOf(State::class) }
                .map { klass -> klass.objectInstance }
                .filterIsInstance<State>()
                .associateBy { value -> value.name }

        @JvmStatic fun valueOf(value: String) = requireNotNull(map[value]) {
            "No enum constant ${State::class.java.name}.$value"
        }

        @JvmStatic fun values() = map.values.toTypedArray()
    }

    abstract class VanillaState(name: String, ordinal: Int) : State(name, ordinal)
    abstract class ChocolateState(name: String, ordinal: Int) : State(name, ordinal)

    object StateA : VanillaState("StateA", 0)
    object StateB : VanillaState("StateB", 1)
    object StateC : ChocolateState("StateC", 2)
}

これにより、他と同じように以下を呼び出すことができますEnum

State.valueOf("StateB")
State.values()
enumValueOf<State>("StateC")
enumValues<State>()

更新

EnumKotlinでは、直接拡張はサポートされなくなりました。Enumクラスを明示的に拡張するためのDisallow:KT-7773を参照してください

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

特定の封印されたクラスのすべてのサブクラスを取得するにはどうすればよいですか?

分類Dev

特定の封印されたクラスのすべてのサブクラスを取得するにはどうすればよいですか?

分類Dev

Beautifulsoup-特定のクラスのブロック内のすべてのリンクを取得するにはどうすればよいですか?

分類Dev

Javascript:特定のオブジェクトがインスタンス化されたクラスを取得するにはどうすればよいですか?

分類Dev

クラスのすべての属性を取得するにはどうすればよいですか?

分類Dev

Groovyオブジェクトまたはクラスのすべての変数を取得するにはどうすればよいですか?

分類Dev

Groovyオブジェクトまたはクラスのすべての変数を取得するにはどうすればよいですか?

分類Dev

指定されたクラスのすべてのコンテンツを文字列から取得するにはどうすればよいですか?

分類Dev

python enumクラスからすべての値を取得するにはどうすればよいですか?

分類Dev

Pharoで*すべての*クラスを取得するにはどうすればよいですか?

分類Dev

属性を持つすべてのクラスを取得するにはどうすればよいですか?

分類Dev

特定のタイプのクラスインスタンスのすべてのメンバーを取得するにはどうすればよいですか?

分類Dev

スーパークラスタイプのコレクションがある場合、特定のサブクラスタイプのすべてのアイテムを取得するにはどうすればよいですか?

分類Dev

特定のクラスから特定のリンクを取得するにはどうすればよいですか?

分類Dev

IntelliJ IDEAでクラスのすべての親とサブクラスを表示するにはどうすればよいですか?

分類Dev

ライフサイクル全体で別のストリームによって収集されたすべてのデータを使用して、スパークライブストリームに参加するにはどうすればよいですか?

分類Dev

特定のクラスを持つ入力テキストのすべての値を取得するにはどうすればよいですか?

分類Dev

特定のWebサイトがブラウザからアクセスされるのをブロックするにはどうすればよいですか?

分類Dev

どのサブクラスがコンストラクターに渡されたかを確認するにはどうすればよいですか?

分類Dev

jqueryを使用してdiv内の複数のクラスから指定されたクラス名を取得するにはどうすればよいですか?

分類Dev

特定のクラスのすべての要素を異なるクラスにラップするにはどうすればよいですか?

分類Dev

特定のクラスのすべての要素のIDを取得するにはどうすればよいですか?

分類Dev

1つのIDで入力されたすべてのテキストのクラスを追加するにはどうすればよいですか?

分類Dev

基本クラスで定義されたフィールドのサブクラスで@Autowiredを使用するにはどうすればよいですか?

分類Dev

dartにロードされているすべてのライブラリのリストを取得するにはどうすればよいですか?

分類Dev

封印されたクラスのサブクラスであるネストされたクラスを宣言できないのはなぜですか?

分類Dev

すべてのサブクラスを必然的にプロトコルに準拠させるにはどうすればよいですか?

分類Dev

jar内のすべてのクラスのClassオブジェクトを取得するにはどうすればよいですか

分類Dev

Pythonで、特定のファイル内で定義されたクラスのリストを取得するにはどうすればよいですか?

Related 関連記事

  1. 1

    特定の封印されたクラスのすべてのサブクラスを取得するにはどうすればよいですか?

  2. 2

    特定の封印されたクラスのすべてのサブクラスを取得するにはどうすればよいですか?

  3. 3

    Beautifulsoup-特定のクラスのブロック内のすべてのリンクを取得するにはどうすればよいですか?

  4. 4

    Javascript:特定のオブジェクトがインスタンス化されたクラスを取得するにはどうすればよいですか?

  5. 5

    クラスのすべての属性を取得するにはどうすればよいですか?

  6. 6

    Groovyオブジェクトまたはクラスのすべての変数を取得するにはどうすればよいですか?

  7. 7

    Groovyオブジェクトまたはクラスのすべての変数を取得するにはどうすればよいですか?

  8. 8

    指定されたクラスのすべてのコンテンツを文字列から取得するにはどうすればよいですか?

  9. 9

    python enumクラスからすべての値を取得するにはどうすればよいですか?

  10. 10

    Pharoで*すべての*クラスを取得するにはどうすればよいですか?

  11. 11

    属性を持つすべてのクラスを取得するにはどうすればよいですか?

  12. 12

    特定のタイプのクラスインスタンスのすべてのメンバーを取得するにはどうすればよいですか?

  13. 13

    スーパークラスタイプのコレクションがある場合、特定のサブクラスタイプのすべてのアイテムを取得するにはどうすればよいですか?

  14. 14

    特定のクラスから特定のリンクを取得するにはどうすればよいですか?

  15. 15

    IntelliJ IDEAでクラスのすべての親とサブクラスを表示するにはどうすればよいですか?

  16. 16

    ライフサイクル全体で別のストリームによって収集されたすべてのデータを使用して、スパークライブストリームに参加するにはどうすればよいですか?

  17. 17

    特定のクラスを持つ入力テキストのすべての値を取得するにはどうすればよいですか?

  18. 18

    特定のWebサイトがブラウザからアクセスされるのをブロックするにはどうすればよいですか?

  19. 19

    どのサブクラスがコンストラクターに渡されたかを確認するにはどうすればよいですか?

  20. 20

    jqueryを使用してdiv内の複数のクラスから指定されたクラス名を取得するにはどうすればよいですか?

  21. 21

    特定のクラスのすべての要素を異なるクラスにラップするにはどうすればよいですか?

  22. 22

    特定のクラスのすべての要素のIDを取得するにはどうすればよいですか?

  23. 23

    1つのIDで入力されたすべてのテキストのクラスを追加するにはどうすればよいですか?

  24. 24

    基本クラスで定義されたフィールドのサブクラスで@Autowiredを使用するにはどうすればよいですか?

  25. 25

    dartにロードされているすべてのライブラリのリストを取得するにはどうすればよいですか?

  26. 26

    封印されたクラスのサブクラスであるネストされたクラスを宣言できないのはなぜですか?

  27. 27

    すべてのサブクラスを必然的にプロトコルに準拠させるにはどうすればよいですか?

  28. 28

    jar内のすべてのクラスのClassオブジェクトを取得するにはどうすればよいですか

  29. 29

    Pythonで、特定のファイル内で定義されたクラスのリストを取得するにはどうすればよいですか?

ホットタグ

アーカイブ