如何将关于 class 的静态数据存储到

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;
  }
}

在这里,每个设备子class return对#isBuildable() 要么是真要么是假。但是 Floor 的每个实例总是 returns false。 Device 的另一个实现可能 return 为真。这听起来像是静态数据:它不依赖于当前实例,而是依赖于设备的类型。

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

所以,我在这里想要实现的是创建 abstract static 方法。我已经看到 this question 并没有太大帮助。我会在 Device 的所有子 classes 中强制执行 #isBuildable(这次是静态的),这样我就可以调用 Floor.isBuildable() 或其他类似的东西。

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

如果您需要存储 class 特定(非实例特定)信息,自定义注释可能是最佳选择。

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

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

因为 Java 没有真正的类型变量(用于泛型的类型变量直到 运行 时间才存在)你无论如何都需要一个实例来确定调用哪个被覆盖的静态方法。 假设你有一个 class Device 和两个子 class,FloorCeiling,它们都有一个名为 foo() 的方法。由于没有运行-时间类型的变量,T.foo()无法工作,Device.foo()Floor.foo()Ceiling.foo()都指定了具体调用哪个方法。

有几个solutions/workarounds:

  • 通过反射调用正确的方法。您将丢失所有静态类型检查。

  • 引入伴随枚举或 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 的一种表示,其中包含您想要的信息。