繁体   English   中英

如何将有关 class 的 static 数据存储到

[英]How to store static data about a class to

想象一下,我有一个像这样的抽象 class :

public abstract class Device {

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

  public abstract boolean isBuildable();
}

然后我有一个可能看起来像这样的实现:

public final class Floor extends Device {
  // ...

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

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

目前,我正在创建 class 的实例以获取其值,因为 #isBuildable() 不是 static。 但我认为这是糟糕的代码设计。

所以,我在这里想要实现的就像创建abstract static方法。 我见过这个问题没有太大帮助。 我将强制在 Device 的所有子类中实现#isBuildable(这次是静态的),以便我可以调用Floor.isBuildable()或其他类似的东西。

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

如果您需要存储特定于类(而不是特定于实例)的信息,自定义注释可能是 go 的方式。

这需要一个 function 使用反射来访问该信息,这在一个小项目中可能是多余的,但在更大的框架或类似项目中应该没有问题。

在 Java 中,static 方法不能覆盖其他 static 方法,所以你想做的事情是不可能的。

由于 Java 没有真正的类型变量(用于 generics 的类型变量在运行时才存在),您无论如何都需要一个实例来确定调用哪个覆盖的 ZA81259CEF8E959C624DF1D456E5D327 方法。 假设您有一个 class Device ,它有两个子类FloorCeiling ,它们都有一个名为foo()的方法。 由于没有运行时类型变量, T.foo()无法工作,并且Device.foo()Floor.foo()Ceiling.foo()都指定了要调用的方法。

有一些解决方案/解决方法:

  • 通过反射调用正确的方法。 您将丢失任何 static 类型检查。

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

     public class DeviceType { private final boolean buildable; private DeviceType(boolean buildable) { this.buildable = buildable; } public boolean isBuildable() { return buildable; } } public class Floor extends Device { public static final DeviceType DEVICE_TYPE = new DeviceType(false); ... }

    现在您可以传递Floor.DEVICE_TYPE作为 class 的一种表示,其中包含您想要的信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM