可能重复,我有一个名为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并一个接一个地初始化,但我不想要那个(我也不知道它是如何被编码的),因为我觉得这是不好的做法。对这个问题有什么更好的解决方案吗?
答案 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类的文件。您可以使用此类初始化地图,但我必须承认这不那么有趣。