java对所有扩展类只访问一次静态变量
我的要求是,我有一个auth类,它提供身份验证令牌(它是String
),并且该令牌可以在所有其他类中使用。我写了一小段代码,但不幸的是,所有其他类都在单独生成身份验证令牌。所以每个类有一个身份验证令牌。但我很快做了如下改变。请看看这是一个正确的方法还是有更好的方法
public class AuthProvider {
public static String authKey;
public static String provideAuth() {
AuthProvider pro = new AuthProvider();
String key = pro.generateAuthKey();
authKey = key;
return key;
}
private String generateAuthKey() {
Random rand = new Random();
int n = rand.nextInt(5000) + 1;
return String.valueOf(n);
}
}
上面的一个是我的身份验证提供者类,它向所有其他类提供身份验证令牌
现在,我的名为“FirstClass”的子类需要auth令牌来执行其他操作,如下所示
public class FirstClass extends AuthProvider {
public String getValueFromFirstClass() {
AuthProvider.provideAuth();
String s = AuthProvider.authKey;
return "FirstClassAuth: " + s;
}
}
我的第二个子类名为SecondClass
,它将成为主类,因为main
方法调用这个类中的方法,该方法也负责从FirstClass
中获取某个值
public class SecondClass extends AuthProvider {
public String getValueFromSecondClass() {
FirstClass firstClass = new FirstClass();
String firstClassString = firstClass.getValueFromFirstClass();
String s = AuthProvider.authKey;
return "SecondClass Auth: " + s + " -------- " + firstClassString;
}
public static void main(String[] args) {
SecondClass class2 = new SecondClass();
System.out.println(class2.getValueFromSecondClass());
}
}
所以我的要求是。。我不需要每个子类有两个不同的“AuthToken”。我可以在FirstClass
和SecondClass
中使用一个身份验证令牌。所以我所做的是对的?还是有更好的方法
# 1 楼答案
这就是我的方法,使用带有
static
初始化块的全局常量:然后,在任何其他类中,您都可以使用
AuthProvider.AUTH_KEY
来检索该值# 2 楼答案
我强烈建议您在这里使用单例和依赖注入:
编辑1:
SecondClass
在这种情况下,看起来像:同样,这不是最好的解决方案。通常我们将main方法拆分为一个名为
Application.java
的单独类,该类只有main
方法编辑2:
我们之所以避免使用
extends
,是因为该关键字与相关,是一种范式。在你的例子中,看起来你想使用AuthProvider
和表达依赖关系——这在英语中听起来像FirstClass
和SecondClass
没有AuthProvider
就无法完成他们的工作这是由构造函数DI(依赖项注入)完成的,如果不提供
AuthProvider
的实例,就不能使用(实例化)这两个类如果你不是在构建一个Web应用程序,你甚至不需要把
AuthProvider
作为一个单身汉:然后将
main
方法更改为:DI将把它传播到
FirstClass