java - 如何向具有静态方法的类提供参数而不更改其静态限定符?

标签 java dependency-injection static-methods

我有一个带有静态方法的类:

public class CompletelyStatic {

    public final static String PARAM = "abc";

    public static String doSomethingSpecial() {
        return "qqq" + PARAM;
    }

}

这些方法在整个代码中随处可见。新的要求是从外部配置加载 PARAM 值。该配置是通过 Config 对象通过依赖注入(inject)提供的,即

public class CompletelyStatic {

    @Inject
    private Config configProvider;

    public final static String DEFAULT_PARAM = "abc";

    public String doSomethingSpecial() {
        return "qqq" + configProvider.getSpecialParam(DEFAULT_PARAM);
    }

}

不幸的是,在这里我必须更改 doSomethingSpecial 上的静态限定符,所以在我使用它的任何地方,我都必须注入(inject)一个 CompletelyStatic 实例。我宁愿避免这种情况。我可能可以做类似的事情:

public class CompletelyStatic {

    public final static String DEFAULT_PARAM = "abc";

    public static String doSomethingSpecial(Config configProvider) {
        return "qqq" + configProvider.getSpecialParam(DEFAULT_PARAM);
    }

}

但是如果 doSomethingSpecial 调用了下面的一些私有(private)方法,我就必须一起传播 configProvider。有更好的解决办法吗?

编辑。如果 CompletelyStatic 有一些内部私有(private)方法,我应该将 configProvider 传播给它们:

public class CompletelyStatic {

    public final static String DEFAULT_PARAM = "abc";

    public static String doSomethingSpecial(Config configProvider) {
        return "qqq" + otherMethod(configProvider);
    }

    private static String otherMmethod(Config configProvider) {
        return "more logic " + configProvider.getSpecialParam(DEFAULT_PARAM);
    }
}

编辑2。澄清一下,我对 Config 对象没有影响。我知道如果它有静态方法就好了,但它没有。

最佳答案

你可能需要做这样的事情:

public class CompletelyStatic {

    @Inject
    private Config configProvider;

    // Keep a static private instance of your Static class
    private static CompletelyStatic cs = new CompletelyStatic();

    //If needed, make the constructor of your class private
    private CompletelyStatic(){
    }

    public final static String DEFAULT_PARAM = "abc";

    public static String doSomethingSpecial() {
        return "qqq" + cs.getConfigProvider().getSpecialParam(DEFAULT_PARAM);
    }

    public Config getConfigProvider(){
        return configProvider;
    }
}

您的其他私有(private)方法将能够以类似的方式使用 configProvider 对象:cs.getConfigProvider()

Update

public class CompletelyStatic {

    public final static String DEFAULT_PARAM = "abc";

    //Keep a static reference to the ConfigProvider object.
    private static Config configProvider;

    public static String doSomethingSpecial(Config configProvider) {
        CompletelyStatic.configProvider = configProvider;
        return "qqq" + otherMethod(configProvider);
    }

    // Here, you will not need to parameterize your other methods.
    private static String otherMmethod() {
        return "more logic " + configProvider.getSpecialParam(DEFAULT_PARAM);
    }
}

希望这有帮助!

关于java - 如何向具有静态方法的类提供参数而不更改其静态限定符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41181184/

相关文章:

java - 如何通过方法更改类中的静态变量

java - Do - 在用户输入正确或不正确的参数后,While 循环不会继续

dependency-injection - 如何正确地使用深度对象图和许多依赖项进行手动 DI

java - 如何同时创建具有 Autowiring 和非 Autowiring 字段的构造函数?

C++调用静态方法

Javascript - 不能对非静态函数进行静态引用

java - 如何使用 MultipartEntity 从 Android 发送多个字符串变量

java - Selenium 自动化 : Identifying unique set of webelements using selenium in JAVA

java - 相当于ImageIO的文件是什么

asp.net-mvc-3 - ASP.NET MVC3 - 使用 DependencyResolver 和温莎城堡 : Why?