可以在运行时操作静态属性吗?

时间:2010-12-17 15:28:03

标签: java static settings static-methods application-settings

我在Prefs.java类中提供了我的JAVA项目的设置,其中包含静态属性和静态方法。但是OAuth2的令牌需要在运行时分配。这是一个很好的方式......?

public class Prefs {


  //known before runtime
  public static final String SERVER_BASE_URL ="http://api.mycompany.com/";

  //needs to be set on startup through the setter method
  private static String token;


  public static String getToken() {
    return token;
  }

  public static void setToken( String token ) {
    Prefs.token = token;
  }

  public static String getXyEndpointUrl() {
    return SERVER_BASE_URL + "/xy";

  }
}

3 个答案:

答案 0 :(得分:3)

我会反对这种设计。这种类型的静态变量不比全局变量好。 This page给出了为什么要避免它们的一些原因。以下是其中一些。

  • 非局部性
  • 无访问控制或约束检查
  • 隐式耦合
  • 并发问题
  • 测试和限制
  

但OAuth2的令牌需要在运行时分配。这是一个很好的方式......?

在我看来,你似乎想要将这样的标记传递给Prefs对象的构造函数。

答案 1 :(得分:1)

静态变量是C中全局变量的面向对象替代。尽可能避免使用它们。

很多时候你只需要一个对象,在你的情况下它是Prefs对象。

public class Prefs {

  //known before runtime
  public final String SERVER_BASE_URL ="http://api.mycompany.com/";

  //needs to be set on startup through the setter method
  private String token;


  public String getToken() {
    return token;
  }

  public void setToken( String token ) {
    Prefs.token = token;
  }

  public String getXyEndpointUrl() {
    return SERVER_BASE_URL + "/xy";
  }

}

public class Program {

  protected Prefs prefs;

  protected Other prefsAware;

  public Program() {
    prefs = new Prefs();
    prefsAware = new Other(prefs);
  }

  // or even (if you don't like constructor mediated passing of prefs)
  public Prefs getPrefs() {
    return prefs;
  }

}

答案 2 :(得分:0)

通常在运行时从属性文件中读取全局配置。您可以为开发,QA和生产环境提供不同的配置文件。

至少需要注意的是,在Web应用程序中,如果从Web请求设置静态变量,如果不同步setter,则可以使用数据。如果你只是阅读那么你应该没事。

您正在做的另一种选择是为什么不将OAuth密钥注入处理系统身份验证问题的服务?你可以做你需要做的静态资源,但在这种情况下,你应该知道你并不需要一个静态变量来保存密钥。