我创建了一个 abstract class
包含一个带有实现的方法。此方法由子类调用以填充列表,该列表应在每个单独子类的所有实例之间共享(例如 abstract static
字段,对于每个子类而言不同且静态)。问题是:abstract static
字段不存在,那么我还能如何实现这种行为?
对于上下文,abstract class
上实现的方法用于通过 reflections8 包从非限定名称解析类。此方法调用 abstract
方法来获取要反射的包,它只返回一个 String[]
(因为子类将要在不同的包中搜索)。然后,此方法生成一个 Map<String, Class<?>>
,其中包含每个反射类的名称到 Class
的映射,这是我希望在每个特定子类类型的实例之间共享的(这样它不会必须多次反映同一个子类)。最终,该方法由子类调用,以便从其非限定名称实例化一个类。
如果这是一种相当奇怪的做事方式,请原谅我;我来自 iOS 领域,在那里我们没有将包名附加到类名(所以我可以只调用 NSClassFromString("ClassName")
,仅此而已)。
编辑:查看 this gist 以了解当前实现(并查看使用示例的注释)。
答案 0 :(得分:2)
我的想法:如果您希望子类拥有各自的静态字段,最好只在其中声明这些静态字段,而不是在 abstract class
中声明。
据我所知,您的 abstract class
实际上只是这个已实现方法的占位符。您的任何子类是否覆盖了父类的任何内容?如果不是,也许它不需要是抽象类。
另外,您的 abstract class
需要任何状态吗?因为如果没有,您可能会更好:将您的 abstract class
更改为 static class
,并将您实现的方法更改为 static
方法,该方法接受“ClassName”参数。然后在您的子类中,您可以使用类似于 MyStaticClass. NSClassFromString(subclassStaticField);
答案 1 :(得分:0)
对于字段,abstract static
没有等效项:
实例字段不能为 abstract
。这真的没有任何意义。 abstract
表示我们将一些细节推迟到子类。但是对于一个实例字段来说,延迟没有任何意义。
static
字段无论如何都不会被继承,因此无法以多态方式使用。不同类中同名的static
字段是不同的变量。
您(当然)可以使用反射来测试字段(静态或实例)是否已声明 ...但这不是 abstract
在 Java 中的意思。
解决方案:
如果您希望实例字段存在于 abstract
类的所有子类中,请将其声明为 abstract
类中的常规字段。
如果您希望 static
字段存在于所有子类中,您别无选择,只能在每个子类中显式声明它。您将无法以多态方式使用它/它们。