我在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";
}
}
答案 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密钥注入处理系统身份验证问题的服务?你可以做你需要做的静态资源,但在这种情况下,你应该知道你并不需要一个静态变量来保存密钥。