【问题标题】:Better way of initialising List of abstract class with inheriting class names用继承类名初始化抽象类列表的更好方法
【发布时间】: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


    【解决方案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 类的文件。你可以使用这个类来初始化你的地图,但是,我不得不承认这不那么有趣。

    【讨论】:

      猜你喜欢
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-27
      • 2020-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多