2016-12-16 16 views
2

我有静态方法的类:如何使用静态方法向类提供参数而不更改其静态限定符?

public class CompletelyStatic { 

    public final static String PARAM = "abc"; 

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

} 

这些方法在整个代码everywere使用。新的要求是从外部配置加载PARAM值。这个配置是通过配置对象提供的,通过依赖注入,即

public class CompletelyStatic { 

    @Inject 
    private Config configProvider; 

    public final static String DEFAULT_PARAM = "abc"; 

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

} 

不幸的是,在这里我不得不改变doSomethingSpecial静态预选赛,所以无论我用它,我必须注入CompletelyStatic实例。我宁愿避免这种情况。我大概可以做这样的事情:

public class CompletelyStatic { 

    public final static String DEFAULT_PARAM = "abc"; 

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

} 

但如果doSomethingSpecial调用下面一些私有方法,我会沿着传播configProvider。有更好的解决方案吗?

编辑。如果CompletelyStatic有一些内部的私有方法,我应该再传播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.要澄清一下,我有配置对象上没有影响。我知道如果它有静态方法会很好,但它不会。

+0

你的问题是不完整的,主要是在最后一节..请问你的私有方法是什么样子? – developer

回答

2

您可能必须做这样的事情:

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; 
    } 
} 

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

更新

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); 
    } 
} 

希望这有助于!

+0

是的,这确实有帮助,似乎是最好的解决方案。虽然感觉像一个黑客 - 创建一个只能在同一个班级内使用的单身人士。 :) – marud

+0

我有种要重新考虑,如果可能最好是真正改变我的CompletelyStatic类是实际上是一个bean本身。但无论如何,谢谢你的答案。 – marud

1

通常,配置对象必须是静态

public class CompletelyStatic 
{ 
    public final static String DEFAULT_PARAM = "abc"; 
    public static String doSomethingSpecial() 
    { 
     return "qqq" + Config.getSpecialParam(DEFAULT_PARAM); 
    } 
} 

public class CompletelyStatic 
{ 
    private static String SPECIAL_PARAM = Config.getSpecialParam(DEFAULT_PARAM); 
    public final static String DEFAULT_PARAM = "abc"; 
    public static String doSomethingSpecial() 
    { 
     return "qqq" + SPECIAL_PARAM; 
    } 
} 

配置应该是一个单件实例在这种情况下Config.getInstance().getSpecialParam(DEFAULT_PARAM);

希望这有助于:)

1

更好的解决方案可以被加载在应用程序启动staticConfig变量通过init()类似方法如图中下面的代码。这种方法的优点是,如果您从Config移动到其他位置,则不需要更改/修改所有相关类别。否则,您需要从您调用的所有类中更改doSomethingSpecial()

public class CompletelyStatic { 

     private static Config configProvider; 

     //you need to load the below init method during application start up 
     public static void init(Config configProvider) { 
      CompletelyStatic.configProvider= configProvider; 
     } 

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

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

而且,在这种方法中,方法签名public String doSomethingSpecial()没有从原来的类改变(所以所有的依赖类的没有影响,但唯一的一点是加载启动期间init)。

相关问题