2016-04-04 74 views
1

目前我有幾個類定義了幾個枚舉。他們都看起來類似下圖所示:創建一個抽象基類來處理不同類型的枚舉

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; 
    } 
    } 

也有在ApaMessage定義的方法:

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)來執行循環?

我已經嘗試了不同的方法,但主要問題是基類似乎無法訪問值。有沒有辦法解決?或者,有沒有更好的方法?由於

編輯:

基本上我想在基類中是這樣的。請注意下面的代碼不能編譯。

公共抽象類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     
     } 
    } 
} 

然後調用基方法如下,雖然不知道,如果這是正確的,其中ApaFields是以上所定義的內枚舉。

ApaRequest(ApaFields.class, somestringmessage); 
+0

告訴我們你試過的東西。 –

+1

除非您的示例具有誤導性,否則我認爲您不應該使用內部枚舉。我要麼使用一個外部定義的枚舉來存放所有的FIELDS,要麼在每個類上聲明一個字段作爲私有字段 – Aaron

+1

也許你的枚舉應該實現一個通用接口,並且你只能在返回哈希映射的方法中使用該接口。 – dumitru

回答

0

當試圖使用枚舉作爲表中的列來定義數據庫模式時,我遇到了類似的情況。我最終走上了這條路。

定義一個具有足夠通用簽名的基類以確保正確構建枚舉。

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

感謝您的幫助,但有一個問題,您如何遍歷Table類中的Column enum並獲取Column中的所有值?基本上這是我的大問題。即你怎麼做(列字段:Column.values()){}唯一可以訪問的是getEnumConstants()而不是實際的值。 –

+0

該解決方案非常冗長。您可以使用一些代碼生成器來解析一些XML或SQL格式來生成Java代碼。 –

+0

@SoucianceEqdamRashti - 「Table」父類使用本地最終的「Set 」列填充;'在建造時。這可以簡單地迭代。由於它們都實現了'列',所以它們可以以通用的方式操縱。 – OldCurmudgeon