想要在静态方法中调用非静态接口方法.如何?



我在代码片段中遇到了一个真正的难题。

我想学习如何以正确的方式在 Java 中使用 Interface。

所以为此我有我的应用程序类...

package inversionUsage;
public class Application {
public static void main(String [] args) {
String standard = "Standard version!";
if (FeatureDecisions.checkEnabledFeatures("new-feature1")) {
System.out.println("Implement new feature...");
}else {
System.out.println(standard);
}
}
}

然后我做了一个界面...

package inversionUsage;
public interface AppConfiguration {
boolean isEnabled(String searchFeature);
}

我想在另一个类中使用接口:

package inversionUsage;
import java.util.Arrays;
public class FeatureDecisions implements AppConfiguration{
public String [] enabledFeatures;
public String [] _implNewFeature = fetchFeatureTogglesFromSomehere();
public static boolean checkEnabledFeatures(String searchFeature) {
return isEnabled(searchFeature);
}
@Override
public boolean isEnabled(String searchFeature) {
if (Arrays.asList(_implNewFeature).contains(searchFeature)) {
return true;
}else {
return false;
}
}
private String [] fetchFeatureTogglesFromSomehere() {
// TODO get the CONFIG from somewhere
enabledFeatures = new String [2];
enabledFeatures[0] = "new-feature1";
enabledFeatures[1] = "new-feature2";
return enabledFeatures;
}
}

所以工作流程是: 1. 我开始申请 2. Main 方法通过功能决策检查启用的功能.java 3. 在功能决策中,我实现了接口

我收到错误:

Cannot make a static reference to the non-static method isEnabled(String) from the type FeatureDecisions

有人可以帮助我吗?

使用实例方法的唯一方法是拥有一个可以调用它的实例。您的checkEnabledFeatures是静态的,因此它不会接收您可以使用的实例(如this(。若要使用实例方法,它需要创建一个实例。但显然这不是你想要的。

Java 的interface构造用于定义实例实现的接口。Java没有类必须实现的"静态接口"的概念。在极少数需要的情况下,它通常使用反射来实现(可能使用类级注释来指示类具有必要的功能(。

您必须实例化 FeatureDecisions 类。

public static boolean checkEnabledFeatures(String searchFeature) {
return new FeatureDecisions().isEnabled(searchFeature);
}

或将所有成员设为静态。

附加信息:有像 togglz 这样的框架可以为你做到这一点。

没有办法做到这一点。最接近的方法是使用单例模式(尽管很多人 - 包括我自己 - 会不鼓励它(。

public enum FeatureDecisions implements AppConfiguration
{
INSTANCE;
public String [] enabledFeatures;
public String [] _implNewFeature = fetchFeatureTogglesFromSomehere();
public boolean checkEnabledFeatures(String searchFeature) {
return isEnabled(searchFeature);
}
@Override
public boolean isEnabled(String searchFeature) {
//...
}
}

然后,您的呼叫将从以下位置更改为:

FeatureDecisions.checkEnabledFeatures(...)

FeatureDecisions.INSTANCE.checkEnabledFeatures(...)

还值得注意的是,checkEnabledFeatures除了服从isEnabled之外,实际上什么也没做。你可以放弃前者,直接打电话给后者。

最新更新