我有一个带有静态方法的类:
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/