如何将关于 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,Floor
和 Ceiling
,它们都有一个名为 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 的一种表示,其中包含您想要的信息。
假设我有这样一个摘要 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,Floor
和 Ceiling
,它们都有一个名为 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 的一种表示,其中包含您想要的信息。