想象一下,我有这样一个抽象类:
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;
}
}在这里,每个设备子类都向#isBuildable()返回true或false。但是地板的每一个实例都会返回false。设备的另一个实现可能返回true。这听起来像是静态数据:它不依赖于当前实例,而是取决于设备的类型。
目前,我正在创建类的一个实例以获得它的值,因为#isBuildable()不是静态的。但我认为这是糟糕的代码设计。
所以,我在这里试图实现的是创建abstract static方法。我见过this question帮不了多少忙。我会强制在设备的所有子类中实现#isBuildable (这次是静态的),这样我就可以调用Floor.isBuildable()或其他同类的东西了。
在这里,我不能控制所有的源,所以我不能使用反射率。希望你能理解这个奇怪的问题!
发布于 2020-07-30 15:23:09
如果您需要存储特定于类的(而不是特定于实例的)信息,那么自定义注释可能是最好的选择。
这需要一个使用反射的函数来访问这段信息,这在一个小项目中可能会有些过分,但是在一个更大的框架或类似的项目中应该是没有问题的。
发布于 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传递为类的一种表示形式,该类包含您想要的信息.
https://stackoverflow.com/questions/63176259
复制相似问题