首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将有关类的静态数据存储到

问如何将有关类的静态数据存储到
EN

Stack Overflow用户
提问于 2020-07-30 15:16:49
回答 2查看 75关注 0票数 0

想象一下,我有这样一个抽象类:

代码语言:javascript
复制
public abstract class Device {

  public Device(DeviceModel model){
    // ...
  }

  public abstract boolean isBuildable();
}

然后,我有一个可能如下所示的实现:

代码语言:javascript
复制
public final class Floor extends Device {
  // ...

  @Override
  public void boolean isBuildable(){
    return false;
  }
}

在这里,每个设备子类都向#isBuildable()返回true或false。但是地板的每一个实例都会返回false。设备的另一个实现可能返回true。这听起来像是静态数据:它不依赖于当前实例,而是取决于设备的类型。

目前,我正在创建类的一个实例以获得它的值,因为#isBuildable()不是静态的。但我认为这是糟糕的代码设计。

所以,我在这里试图实现的是创建abstract static方法。我见过this question帮不了多少忙。我会强制在设备的所有子类中实现#isBuildable (这次是静态的),这样我就可以调用Floor.isBuildable()或其他同类的东西了。

在这里,我不能控制所有的源,所以我不能使用反射率。希望你能理解这个奇怪的问题!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-30 15:23:09

如果您需要存储特定于类的(而不是特定于实例的)信息,那么自定义注释可能是最好的选择。

这需要一个使用反射的函数来访问这段信息,这在一个小项目中可能会有些过分,但是在一个更大的框架或类似的项目中应该是没有问题的。

票数 1
EN

Stack Overflow用户

发布于 2020-07-30 16:05:17

在Java中,静态方法不能覆盖其他静态方法,因此您想要做的事情是不可能的。

因为Java没有真正的类型变量(用于泛型的类型变量直到运行时才能存活),所以无论如何,您都需要一个实例来确定要调用哪个覆盖的静态方法。假设您有一个类Device,它有两个子类,Floor和Ceiling,所有这些子类都有一个名为foo()的方法。由于没有运行时类型变量,T.foo()无法工作,而Device.foo()、Floor.foo()和Ceiling.foo()都指定了要调用的方法。

有几种解决办法/解决办法:

  • 通过反射调用正确的方法。您将失去任何静态类型检查.

  • 引入了一个伙伴枚举或类,其中包含有关类型的信息。例如:

公共类DeviceType {私有最终布尔可建;私有DeviceType (布尔可建){ this.buildable =可构建;}公共布尔isBuildable() {返回可建;}公共类层扩展设备{公共静态最终DeviceType DEVICE_TYPE =新DeviceType(假);.}

现在您可以将Floor.DEVICE_TYPE传递为类的一种表示形式,该类包含您想要的信息.

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63176259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档