Tob*_*ler 21 java static interface abstract
首先,我阅读了erickson对"为什么我不能在Java接口中定义静态方法?"的有用回复..这个问题不是关于"为什么"而是关于"当时如何?".
虽然我现在确信在大多数情况下我想做的事情是矫枉过正,但有一种情况可能需要:
我再举一个ParametricFunction
例子.现在让我们来看一个复杂的函数,比如Bessel函数,其中查找表是合适的.这必须初始化,因此两个选项是将参数直接传递给构造函数或提供init(double[] parameters)
.后者的缺点是getValue(double x)
必须检查每次调用的初始化(或者ArrayIndexOutOfBoundsException
必须考虑初始化检查),因此对于时间要求严格的应用程序,我更喜欢构造函数方法:
interface ParametricFunction {
public double getValue(double x);
}
class BesselFunction implements ParametricFunction {
public BesselFunction(double[] parameters) { ... }
public double getValue(double x) { ... }
}
Run Code Online (Sandbox Code Playgroud)
这涉及另一个问题,接口中构造函数的不可能性.那里有什么好的解决方案?我当然可以使用这种init(double[] parameters)
方法,但我之所以提到我的原因.
(编辑:好的,这里实现接口的抽象类会这样做)
现在让我们假设ParametricFunction
只允许某些参数,例如正整数.如何检查传递给构造函数的参数的真实性?抛出一个IllegalArgument
例外是可能的,但checkParametersValidity(double[] parameters)
似乎更方便.但是在构造之前需要检查参数,因此它必须是静态方法.这就是我真正想知道的方法,以确保实现ParametricFunction
接口的每个类都定义了这个静态方法.
我知道这个例子是相当人为的,不仅仅是init
通过接口使用方法的原因值得商榷,我仍然想知道答案.如果您不喜欢它,请将其视为学术问题.
(原例)
所以基本上我希望一个接口提供常用方法和例如getSimilarObject
方法.对于(一个组成的)例子
public interface ParametricFunction {
/** @return f(x) using the parameters */
static abstract public double getValue(double x, double[] parameters);
/** @return The function's name */
static abstract public String getName();
/** @return Whether the parameters are valid [added on edit] */
static abstract public boolean checkParameters(double[] parameters);
}
Run Code Online (Sandbox Code Playgroud)
然后
public class Parabola implements ParametricFunction {
/** @return f(x) = parameters[0] * x² + parameters[1] * x + parameters[2] */
static public double getValue(double x, double[] parameters) {
return ( parameters[2] + x*(parameters[1] + x*parameters[0]));
}
static public String getName() { return "Parabola"; }
// edit:
static public boolean checkParameters(double[] parameters) {
return (parameters.length==3);
}
}
Run Code Online (Sandbox Code Playgroud)
由于在当前的Java标准中不允许这样做,最接近它的是什么?
这背后的想法是将几个ParametricFunction
s放在一个包中并使用Reflection将它们全部列出,允许用户选择例如要绘制哪一个.显然,人们可以提供一个包含可用ParametricFunction
s 数组的加载器类,但每次实现一个新的时,都必须记住在那里添加它.
编辑:调用它的一个例子是
public double evaluate(String fnName, double x, double parameters) throws (a lot) {
Class<ParametricFunction> c = (Class<ParametricFunction>) ClassLoader.getSystemClassLoader().loadClass(fnName);
Method m = c.getMethod("getValue", x, parameters);
return ((double) m.invoke(null));
}
Run Code Online (Sandbox Code Playgroud)
并打电话evaluate("Parabola", 1, new double[]{1,2,0});
.
Don*_*ows 17
您不能要求类通过接口实现特定的静态方法.在Java术语中它没有任何意义.接口强制在实现接口的类中存在特定的非静态方法; 这就是他们所做的.
最简单的方法是使用某种工厂类来生成其他工厂的实例.是的,这确实意味着你必须记住在添加新实例时保持该工厂的最新状态,但是,当你做一个新的实现时,你要做的第一件事是测试它(你测试它,是吗?)你'我会很快发现这个问题!
归档时间: |
|
查看次数: |
16207 次 |
最近记录: |