2016-04-04 8 views
1

現在いくつかのクラスにいくつかの列挙型が定義されています。それらはすべて、以下に示すものと同じように見える:ApaMessageで定義された方法も異なるタイプの列挙型を処理する抽象基本クラスを作成する

public class ApaMessage { 
    private String apaMessage; 
    private final int FIXED_LENGTH_SIZE=39; 


    public enum ApaFields { 
    FIELD1(ApaUtils.ApaFieldTypes.POSITION_BASED, null, "field1", 2, 3, false, false), 
    private final ApaUtils.ApaFieldTypes type; 
    private final String ApaName; 
    private final String jsonName; 
    private final int start; 
    private final int finish; 
    private boolean required = false; 
    private boolean withDelimiter = false; 

ApaFields(ApaUtils.ApaFieldTypes type, String ApaName, String jsonName, int start, int finish, boolean required, boolean withDelimiter) { 
     this.type = type; 
     this.ApaName = ApaName; 
     this.jsonName = jsonName; 
     this.start = start; 
     this.finish = finish; 
     this.required = required; 
     this.withDelimiter = withDelimiter; 
    } 
    } 

があります:コードの多くはありませんが、問題がある

private HashMap<String,Object> getApaJsonFieldsAndValues() { 
    HashMap<String, Object> jsonApaData = new HashMap<String, Object>(); 
    for (ApaFields field : ApaFields.values()) { 
     jsonApaData.put(field.jsonName, getApaFieldValue(field)); 
    } 
    return jsonApaData; 
    } 

が、私はすぐに持っていますこれらの列挙体の10〜20。私はHashMapメソッドと他の同様のメソッドが含まれる抽象基本クラスを作成したいと思います。基本クラスは、ApaFields列挙型およびその他の列挙型を受け入れ、getApaJsonFieldsAndValuesの機能を実行する必要があります。問題は、ベースクラスが、渡された列挙型の値とjsonNameなどの内部フィールドにループでアクセスするにはどうすればよいのでしょうか?

私はさまざまなアプローチを試みましたが、主な問題は基本クラスが値にアクセスできないように見えることです。これを回避する方法はありますか?あるいは、より良いアプローチがありますか?おかげ

はEDIT:

基本的に私は、基本クラスでは、このような何かをしたいと思います。以下はコンパイルされないことに注意してください。 ApaFieldsは上記で定義されたインナー列挙され

次いで

パブリック抽象クラスApaRequestMessage {

private Class<? extends Enum<?>> apaRequestMessageFields; 
    private String apaMessage; 
    public <T extends Enum<T>> void ApaRequest(Object apaRequestFields, String apaMessage) { 

     apaRequestMessageFields = (Class<? extends Enum<?>>) apaRequestFields; 
     this.apaMessage = apaMessage;  
     for (Field field: apaRequestMessageFields.values()) { 
      //this doesn't work because it cannot access the values of apaRequestMessageFields     
     } 
    } 
} 

、以下のように基本メソッドを呼び出し、これが正しいかどうかわからないが、。

ApaRequest(ApaFields.class, somestringmessage); 
+0

あなたが試したことを私たちに教えてください。 –

+1

あなたの例が誤解を招かない限り、内部の列挙型を使用するべきではないと思います。すべてのFIELDを保持する外部定義の列挙を使用するか、各クラスのプライベートフィールドとして単一のFIELDを宣言します。 – Aaron

+1

enumは共通インターフェイスを実装する必要があり、ハッシュマップを返すメソッドでのみそのインターフェイスで作業する必要があります。 – dumitru

答えて

0

テーブルの列としてenumsを使用してdbスキーマを定義しようとすると、同様のことが起こりました。私は結局このルートをとった。

enumが正しく構築されていることを確認するのに十分な汎用署名を持つ基本クラスを定義します。

public class Table<Column extends Enum<? extends Column>> { 
    // Name of the table. 

    protected final String tableName; 
    // All of the columns in the table. This is actually an EnumSet so very efficient. 
    protected final Set<Column> columns; 

    /** 
    * The base interface for all Column enums. 
    */ 
    public interface Columns { 

     // What type does it have in the database? 
     public Type getType(); 
    } 

    // Small list of database types. 
    public enum Type { 
     String, Number, Date; 
    } 

    public Table(String tableName, 
      Set<Column> columns) { 
     this.tableName = tableName; 
     this.columns = columns; 
    } 

} 

今、各テーブルのためにこれを拡張する - ここにあるVersionTableシンプル:

public class VersionTable extends Table<VersionTable.Column> { 

    public enum Column implements Table.Columns { 
    Version(Table.Type.String), 
    ReleaseDate(Table.Type.Date); 

    final Table.Type type; 

    Column(Table.Type type) { 
     this.type = type; 
    } 

    @Override 
    public Type getType() { 
     return type; 
    } 
    } 

    public VersionTable() { 
    super("Versions", EnumSet.allOf(Column.class)); 
    } 
} 

今、あなたは、基本クラスのコア機能のすべてを持っているし、すべてのサブのクラスが実装されて行う必要がありますenumのインターフェイス。

これは、すべての列挙型で重複したbolierplateコードの問題に対処していませんが、alomstのすべてを別の場所に移動します。

+0

ヘルプありがとう、1つの質問、どのようにテーブルクラスの列の列挙型をループし、列のすべての値を保持するのですか?本質的にそれは私の大きな問題です。私。どのようにしますか(Column field:Column.values()){}唯一アクセス可能なのは、実際の値ではなく、getEnumConstants()です。 –

+0

その解決策は非常に冗長です。いくつかのXMLまたはSQL形式を解析してJavaコードを生成するコードジェネレータを使用できます。 –

+0

@SoucianceEqdamRashti - 'Table'親クラスには、構築時にローカル最終' Set columns;が設定されます。これは簡単に繰り返すことができます。彼らはすべて「列」を実装するので、共通の方法でマニピュレートすることができます。 – OldCurmudgeon

関連する問題