[英]Want to call a non-static Interface method in a static method. How?
我在代碼片段中遇到了一個真正的難題。
我想學習如何正確使用Java接口。
所以為此,我有了我的應用程序類...
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方法通過FeatureDecisions.java檢查啟用的功能。3.在Feature Decisions中,我實現了接口
我收到錯誤:
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
除了checkEnabledFeatures
isEnabled
之外,實際上不做任何其他事情。 您可以報廢前者,而直接致電后者。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.