【发布时间】:2017-11-13 17:15:13
【问题描述】:
可能重复,我有一个名为 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 类使用以下代码初始化代码:
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 并进行进一步的操作。我想消除静态块,并希望哈希图在我创建(而不是初始化)扩展它的新具体类时自动填充。这将帮助我在我的业务逻辑需要时创建新的具体类,即明天我可以添加任何新的字段类型(例如照片)并为此编写特定的逻辑,而不必每次都在静态块中添加一行。我不介意一个更好的解决方案,它也消除了 fieldTypes hashMap。我知道有一些方法可以通过反射来遍历整个“fieldTypes”子包并一个接一个地初始化,但我不希望这样(也不知道它是如何编码的),因为我觉得这是不好的做法。有什么更好的办法解决这个问题?
【问题讨论】:
标签: java android oop inheritance abstract