タイプのリストに使用した列挙型を持つプログラムを作成していますが、後で実行時に拡張できるようにしたいのですが、これを行う最善の方法が何であるかわかりません。私が考えることができた唯一の方法は、列挙型の単純さを失うので、やりたくない列挙型の代わりにクラスの配列を使用することです。
4 に答える
列挙型は完全に静的な列挙型であると想定されているため、コンパイル時に列挙型がカバーする正確な値を知ることができなければなりません。
コンパイル時に Java ファイルを生成することで、値の柔軟性を少し高めることができますが、これはかなりやり過ぎです。
あなたの最善の策は次のとおりです。
1) 実行時にクラスの新しいインスタンスを作成できるように、一連の事前定義されたインスタンスを使用してクラスを使用すること。
また
2) デフォルト値を含む列挙型が実装するインターフェースを作成し、何らかの形式の列挙型構造を保持しながら、実行時に新しいインスタンスを作成できるようにします。
Java 列挙型は、実行時に展開/拡張できません。それらは定数に似ています。拡張可能な列挙型が必要な場合enum
は、適切な概念ではない可能性があります!
実行時にインスタンス化する単純なクラスの使用を検討してください。
コンパイル時にそこにある必要があるすべての値を知ることができない場合は、文字列を使用します。属性または動作をそれに関連付ける場合は、マップを使用できます。これはJavaではかなり一般的です。Python でも、人々は列挙型に文字列を使用します。
Java 7 では、switch ステートメントが文字列で機能するようになりました。IMO は、この文字列の使用をサポートするための動きです。
Java でのこのような使用例については、 https ://github.com/netty/netty/blob/master/example/src/main/java/io/netty/example/telnet/TelnetClientInitializer.java を参照してください。
列挙はコンパイル時に修正されます。どのように正確に「シンプルさを使用」しますか? switch
たとえば、事前に知られていない定数を使用してコマンドを記述することはできません。
何かの型に基づいて分岐することがポイントである場合は、従来の OO 分解 (リスト内のすべての型でメソッドを作成し、ポリモーフィズムに正しい分岐を選択させる) を使用するか、クラス オブジェクトから機能オブジェクトまたは戦略の実装への HashMap を使用できます。