2009-03-19 15 views
5

私はSwingの学習曲線に近づき、InputMapActionMapについて読んでいます。 SwingのO'Reillyの本書では、ActionMapの鍵はいずれもObjectとなりますが、慣習としてはStringです。Java Swing ActionMap keys

String以外のオブジェクトを使用する理由はありますか? (例:enum

文字列リテラルを使用することは悪い習慣だと思います。文字列リテラルは、コンパイルエラーを発生させることなくミスタイプする可能性があるためです。だから私は、一度定義された不変static finalのクラス変数としてActionMapキーを格納することをお勧めします(例えば、MyAction.NAME)。

編集:だけ明確にする、私はドキュメントを読んでいたとき、頭に浮かんだ考えはenumではなくStringを使用することでした。理由はありますかStringを使用する必要がありますか?

答えて

2

なぜ私は直接列挙型を使用しないのか分かりませんが(O'Reillyの本を見ていない)、このような場合はEnum.toString()メソッドこれは、非常に多くの静的変数を定義するのオーバーヘッドを節約

MyActions.NAME.toString() 

のように、あなたは状態に関する更なる情報を保存したい場合は、MyActions列挙型の機能を拡張してみましょう、それが列挙型ごとに一意の文字列を保証します。コンパイル時にエラーが発生しました。

編集:SwingはEnumに先立ちます。それはちょうど私達の便利なキャッチオール答えになることができますか? card layoutのapiを見てください。列挙型を頼んだデザインがあった場合、それはカードレイアウトです(同じ場所に表示されるコンポーネントのリストを循環させることができます)。私は、文字列が優先されるようなユースケースがあると考えていますが(例えば、ユーザーが追加したマテリアルなど)、これは大抵の場合、これをある種の定義済みの状態パターンで使用しようとしています。

+0

「なぜenumを直接使用しないのかわかりません」:まったく!それが私の最初の考えでした。 –

0

実際に、あなたが提案しているのは、スイング自身が(ときどき)何をするのかということです。

javax.swing.DefaultEditorKitクラスを確認してください。これらのすべての静的最終文字列は、SwingによってActionMapを作成するために使用されます。

ただし、WindowsLookAndFeelなどの一部のルックアンドフィールの初期化を確認すると、ソースコードにはハードコードされた文字列リテラルも含まれます。