Java 在接口的所有子类中强制使用静态变量
我有一个接口Java 在接口的所有子类中强制使用静态变量,java,interface,static,Java,Interface,Static,我有一个接口Calculator,它塑造了一个类,该类计算一些结果并返回给定模式的结果 interface Calculator { List<Object> getResults(); List<String> schema(); } 接口计算器{ List getResults(); 列表模式(); } 它的每个子类都有不同的模式,因为它们计算的内容并不完全相同。但同一子类的所有实例都具有相同的模式,因为它每次都以相同的方式计算 问题是,我想在代码
Calculator
,它塑造了一个类,该类计算一些结果并返回给定模式的结果
interface Calculator {
List<Object> getResults();
List<String> schema();
}
接口计算器{
List getResults();
列表模式();
}
它的每个子类都有不同的模式,因为它们计算的内容并不完全相同。但同一子类的所有实例都具有相同的模式,因为它每次都以相同的方式计算
问题是,我想在代码中的其他地方访问该模式,而不必计算任何内容,因为计算可能非常昂贵
理想情况下,我希望每个子类都有自己的公共静态最终列表模式
属性。但是由于静态属性/方法不能被重写,我不能要求计算器
接口的所有子类都实现它
有没有办法,或者我必须在计算结果时存储模式,并将此模式传递给以后使用?(我想这可能会变得单调乏味)对于字符串常量,您可以使用运行时类注释作为模式, 和运行时检查:
default List<String> schema() {
Schema schema = getClass().getAnnotation(Schema.class);
if (schema == null) {
throw new IllegalStateException("Class is missing @Schema annotation: "
+ getClass().getName());
}
return schema.getValues();
}
@Schema({"e", "pi", "i"})
public class ScientificCalculator implements Calculator { ... }
默认列表架构(){
Schema Schema=getClass().getAnnotation(Schema.class);
if(schema==null){
抛出新的IllegalStateException(“类缺少@Schema注释:”
+getClass().getName());
}
返回schema.getValues();
}
@模式({“e”、“pi”、“i”})
公共类ScientificCalculator实现计算器{…}
通过重写
schema()
可以实现更动态的功能,但不能强制类定义静态字段。你真的需要吗?或者只需要Subclass.SCHEMA,不要忘记为每个子类定义它?我可以选择第二个选项,但这是否意味着另一个程序员可以对接口进行子类化,而忽略SCHEMA?是的,这是可能的。好的,我想我会这样做,因为需要实例化一个子类来访问SCHEMA,这应该不是什么大问题。这似乎是一个相当聪明的解决方案,但我的第一个想法是:如果有人可以修改它,因此它不是静态和最终的呢?我发现如果是的话,我会使用tsolakp的解决方案,因为我不想让我的代码太复杂,而且我的类设计有一些缺陷,无论如何,我可能会修改它。但类注释似乎是一个非常有趣的解决方案,我将深入研究它。