如何实现类似于“抽象静态”字段的功能

时间:2021-04-21 04:29:16

标签: java

我创建了一个 abstract class 包含一个带有实现的方法。此方法由子类调用以填充列表,该列表应在每个单独子类的所有实例之间共享(例如 abstract static 字段,对于每个子类而言不同且静态)。问题是:abstract static 字段不存在,那么我还能如何实现这种行为?

对于上下文,abstract class 上实现的方法用于通过 reflections8 包从非限定名称解析类。此方法调用 abstract 方法来获取要反射的包,它只返回一个 String[](因为子类将要在不同的包中搜索)。然后,此方法生成一个 Map<String, Class<?>>,其中包含每个反射类的名称到 Class 的映射,这是我希望在每个特定子类类型的实例之间共享的(这样它不会必须多次反映同一个子类)。最终,该方法由子类调用,以便从其非限定名称实例化一个类。

如果这是一种相当奇怪的做事方式,请原谅我;我来自 iOS 领域,在那里我们没有将包名附加到类名(所以我可以只调用 NSClassFromString("ClassName"),仅此而已)。

编辑:查看 this gist 以了解当前实现(并查看使用示例的注释)。

2 个答案:

答案 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 字段存在于所有子类中,您别无选择,只能在每个子类中显式声明它。您将无法以多态方式使用它/它们。

相关问题