Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在接口的所有子类中强制使用静态变量_Java_Interface_Static - Fatal编程技术网

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的解决方案,因为我不想让我的代码太复杂,而且我的类设计有一些缺陷,无论如何,我可能会修改它。但类注释似乎是一个非常有趣的解决方案,我将深入研究它。