Java拡張可能列挙
-
03-07-2019 - |
質問
拡張可能な列挙型を記述する方法はありますか。列挙に常に使用できるようにする方法がいくつかあります。たとえば、データベースフィールドに列挙を使用しています。データベースに実際のフィールド名を含めます。
public enum ORDERFIELDS
{
OrderID("Order_ID");
private String FieldName;
private ORDERFIELDS(String fname)
{
this.FieldName = fname;
}
public String getFieldName()
{
return FieldName;
}
}
解決
私が正しく理解している場合、あなたがしたいことは次のようなものです:
public abstract class DatabaseField {
private String fieldName;
private DatabaseField(String fieldName) {
this.fieldName = fieldName;
}
public String getFieldName() {
return fieldName;
}
}
次に、このクラスを拡張する列挙型を定義します。ただし、残念ながら、enumはクラスを拡張できませんが、インターフェイスを実装できます。そのため、現時点でできる最善の方法は、getFieldName()メソッドを含むインターフェイスを定義し、すべての列挙にこのインターフェイスを実装させることです。
ただし、これは、すべての列挙型でこのメソッド(およびその他)の実装を複製する必要があることを意味します。この重複を最小限にする方法については、この質問にいくつかの提案があります。
他のヒント
すべての列挙型は、暗黙的に java.lang.Enum
を拡張します。 Javaは多重継承をサポートしていないため、enumは他のものを拡張できません。
列挙型はインターフェースを実装できますが、コンパイル時にjava.lang.Enumに変換されるため、拡張できません。
抽象列挙型は、潜在的に非常に便利です(現在は許可されていません)。ただし、Sunの誰かにロビーをしてそれを追加する場合は、提案とプロトタイプが存在します。
http://freddy33.blogspot.com/ 2007/11 / abstract-enum-ricky-carlson-way.html
Sun RFE:
http://bugs.sun.com/bugdatabase/view_bug.do? bug_id = 6570766
Java 5より前の5日間にさかのぼる場合は、をご覧ください。項目21、第5章、Josh Blochによる効果的なJava 。彼は、「enums」の拡張について話します。値を追加しますが、おそらくいくつかの手法を使用して新しいメソッドを追加できますか?
Josh BlochのEffective Javaで定義されているメカニズムと同様のメカニズムで列挙型を手作業で作成します。
「拡張」する必要がある場合は追加します。列挙型の場合、おそらく列挙型はあなたが望んでいる構造ではありません。これらは静的定数であることが意図されています。