簡體   English   中英

想要在靜態方法中調用非靜態接口方法。 怎么樣?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM