【问题标题】:How to store static data about a class to如何将有关类的静态数据存储到
【发布时间】:2020-07-30 15:16:49
【问题描述】:

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

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。这听起来像是一个静态数据:它不依赖于当前实例,而是依赖于设备的类型。

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

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

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

【问题讨论】:

  • 即使该值不是动态的,也并不意味着它是糟糕的设计。我猜主要你将使用 Device 类,所以遵循 OOP 方式比使其成为静态方式更好。
  • 逻辑不正确。结果取决于类型使其成为动态的,而不是静态的。类型在运行时确定。静态意味着它可以在编译时解析。

标签: java abstract-class static-methods


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    • 引入一个包含类型信息的伴随枚举或类。例如:

        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 作为包含您想要的信息的类的一种表示形式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-13
      • 2016-03-31
      • 1970-01-01
      • 1970-01-01
      • 2012-08-22
      • 2013-07-03
      相关资源
      最近更新 更多