2016-04-04 54 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