使用继承类名初始化抽象类列表的更好方法

时间:2017-11-13 17:15:13

标签: java android oop inheritance abstract

可能重复,我有一个名为FormField的抽象类,它包含一些常见属性,如字段值,字段标签等。

我的应用程序根据API结果动态呈现字段。所以,我可以得到一个JSON,它表示String类型的fieldX,类型为Date的fieldY等。基于我想要自动呈现正确字段的类型。我已经能够使用带有静态块的抽象类来抽象逻辑。抽象类的代码如下:

// Common fields
public String label;
public String value;

public static Map<String, Class> fieldTypes = new HashMap<>();

static {
    FormField.fieldTypes.put("String", StringField.class);
    FormField.fieldTypes.put("Date", DateField.class);
}

我原本想把静态块放在StringField中,DateField将它们自动添加到其父FormField抽象类中的fieldTypes数组中,但是由于我没有在任何地方明确地调用这些字段类型类,所以它们没有用静态块永远不会被调用。我认为另一种方法是初始化FormField静态块中的每个。

应用程序的工作方式,它从API获取数据,并为每个字段调用一个create方法,该方法接受类型标识字符串,即String,Date,并根据我的FormField类使用以下函数初始化代码: p>

public static FormField create(String type, String label) {
    Class aClass = fieldTypes.get(type);
    if(aClass == null)
        return null;

    FormField field = null;
    try {
        field = (FormField) aClass.newInstance();
        field.label = label;
        return field;
    } catch (InstantiationException e) {
        return null;
    } catch (IllegalAccessException e) {
        return null;
    }
}

然后它调用render方法,该方法呈现UI并进行进一步的操作。我希望消除静态块,并希望每当我创建(不初始化)扩展它的新具体类时,hashmap会自动填充。这将有助于我在业务逻辑需要时创建新的具体类,即明天我可以添加任何新的字段类型(如照片),只需为此编写特定逻辑,而不必每次都向静态块添加一行。我不介意一个更好的解决方案,它也消除了fieldTypes hashMap。我知道通过反思可以通过一些方式来完成整个&#39; fieldTypes&#39; subpackage并一个接一个地初始化,但我不想要那个(我也不知道它是如何被编码的),因为我觉得这是不好的做法。对这个问题有什么更好的解决方案吗?

1 个答案:

答案 0 :(得分:1)

我可以想到两个解决这个问题的方法:

1)这需要一个外部库:https://github.com/ronmamo/reflections 使用此库您可以获取父类的所有实例,我假设Field如下:

Reflections reflections = new Reflections("your.project.fields");
Set<Class<? extends Field>> allClasses = 
     reflections.getSubTypesOf(Field.class);

对于您的情况,无论何时向代码库引入新类,此反射代码都会运行,发现该类并相应地使用它。

2)每当引入新类时,都会更新一个包含所有BlahField类的文件。您可以使用此类初始化地图,但我必须承认这不那么有趣。