web-dev-qa-db-ja.com

システムのJava部分の外側の列挙型を参照するには、文字列またはintを使用する方が良いですか?

私の仕事では、Javaでの列挙型の使用について話し合っていました。

同僚は、サーバー側で列挙型を使用する場合、必要に応じてそれを参照するために文字列を使用する必要があると主張していました(たとえば、JSからサーバーにデータを送信するとき、またはデータベースに格納するとき)、これははるかに明確であると主張しました開発者にとっても、タイプミスの場合にはすぐに失敗するだろうと主張しています。

これらの場合、列挙型を識別するために常に整数を使用しました。それは不変の識別子であり、大文字と小文字の違いやタイプミスの問題がないためです(開発者が1ではなく2を使用するというミスを犯したとしても、すぐには失敗しません)。

これらの引数について非常に分析的であるため、文字列を使用する方が良いと思いますが、私はそれについて不思議な気持ちになります(まるでそれが良いアプローチではなかったかのように)。

この議論に関して私を導くことができるベストプラクティスはありますか?

編集:可能な場合は常に列挙型自体を使用するため、すべてのJavaコードは列挙型を使用します。「列挙型への参照」とは、データの交換時に列挙型の値を参照することを意味しますJavaScriptからサーバーへ、またはデータベースへのデータの保存

10
JSBach

良い質問。 Java=での列挙型の使用は主に、本質的にある程度カテゴリー的な情報を処理することを目的としています。列挙型を使用してカードが持つ可能性のある4種類のスーツを処理する古典的な例です。整数を使用することのパフォーマンス上の利点は、プログラムでも明らかです。

では、Javaの外では、なぜ整数を使い続けないのでしょうか。おそらくJavaの外部に列挙型がないのですが、パフォーマンスの目的で整数を使い続けることができないというわけではありませんよね?はい、それは完全に本当ですが、新しい列挙値を追加するとどうなるかを検討してください。最後に追加しない場合、新しい値の後の他のすべての列挙値は1ずつ増加します。変更できないように番号を指定するか、常に末尾に追加します。あなたの同僚はいつもそれによって正しいと確信していますか?え?恐らく?うまくいけば?たぶん、あなたはそれについて100%ではありません。少しの間それを覚えておいてください。

上司は、最後の更新後にソフトウェアを使用しているクライアントに混乱があると言っています。これで、すべてのエンティティXは、実際にZが割り当てられていても、列挙値Yが割り当てられたように動作します。リポジトリを確認すると、誰かが新しい列挙値を追加し、要求されたガイドラインに従っていませんでした。これで、データベースに4と書かれているという複雑さが加わりました。実際には3である必要がありますが、更新の前に挿入された除くレコード実際にare 4とにかく4に関連する列挙値は何ですか? Yさんじゃないですか?思い出せない。確認するには、プログラムをチェックする必要があります。簡単に言えば、それは混乱です。

代わりに、データベースが「HEARTS」、「DIAMONDS」、「SPADES」、「CLUBS」を書き込んだ場合、スペースの点でほとんど損失せず、多くを獲得しています。パフォーマンスのマイナーヒットについて話しているのは事実ですが、違いをもたらすために頻繁にデータベースにアクセスするべきではありません。スペースに関しては、システム管理者に任せてください(問題ではありません)。

変更が簡単な単純なプログラムを作成した場合、長期的には自分自身を支持したことになります。信頼してください。それのこの面は私の謙虚な意見で違いはありません。

15
Neil

私はニールの答えに同意しますが、追加だけです:

Java enumはオブジェクトなので、フィールドとメソッドを持つことができます。そのため、各enumに手動で指定された値を与えることができ、外部の作業で参照する場合は、代わりにその値を使用します。

列挙インスタンスの名前の追加/削除/並べ替えと変更の両方に耐えます。しかし、多くのツールで利用可能なautomagicを使用する代わりに、列挙型フィールドのシリアライゼーション/デシリアライゼーションロジックを記述する必要があります。 (それは簡単ですが、その追加作業です)。

そして、これらの値を手動で一意に保つ必要があります(ただし、Cスタイルの列挙型では同じです)。それをテストするテストを作成できます。

1
user470365