Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用继承类名初始化抽象类列表的更好方法_Java_Android_Oop_Inheritance_Abstract - Fatal编程技术网

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

Java 使用继承类名初始化抽象类列表的更好方法,java,android,oop,inheritance,abstract,Java,Android,Oop,Inheritance,Abstract,可能是重复的,我有一个名为FormField的抽象类,它包含一些常见属性,如字段值、字段标签等 我的应用程序根据API结果动态呈现字段。因此,我可以得到一个JSON,它表示类型为String的fieldX,类型为Date的fieldY,等等。基于我想要自动呈现正确字段的类型。我已经能够使用带有静态块的抽象类来抽象逻辑。抽象类的代码如下: // Common fields public String label; public String value; public static Map<

可能是重复的,我有一个名为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);
}

然后调用呈现UI的render方法并执行进一步的操作。我希望消除静态块,并希望hashmap在创建(而不是初始化)扩展它的新具体类时自动填充自身。这将有助于我在业务逻辑需要时创建新的具体类,即明天我可以添加任何新字段类型,如photo,只需为此编写特定的逻辑,而无需每次向静态块添加一行。我不介意一个更好的解决方案,它也消除了字段类型hashMap。我知道有一种方法可以通过反射遍历整个“fieldTypes”子包,然后一个接一个地初始化,但我不希望这样(也不知道它是如何编码的),因为我觉得这是一种不好的做法。这个问题有更好的解决方案吗?

我可以想出两种解决方案:

1) 这需要一个外部库: 使用此库,您可以获得父类的所有实例,我假设字段如下:

Reflections reflections = new Reflections("your.project.fields");
Set<Class<? extends Field>> allClasses = 
     reflections.getSubTypesOf(Field.class);
Reflections=新的反射(“your.project.fields”);
设置
Reflections reflections = new Reflections("your.project.fields");
Set<Class<? extends Field>> allClasses = 
     reflections.getSubTypesOf(Field.class);