Java 如何避免使用静态变量?
我对OOP概念很陌生,现在我正在开发一个小系统,它有一个登录系统。我已将用户信息保存在数据库中,当我登录时,我已将其设置为检索用户信息名、权限等,并将其分配给staff类中的一组静态变量,以供以后使用。我想知道是否有办法解决这个问题,在程序登录后运行时保存变量,以便以后在其他表单中使用。我在用户登录时将其分配给静态变量的原因是,我不必每次都检索他的用户信息。例如,如果用户按back键并具有某些特权,我就可以检查要返回到哪个表单。您可以通过构造函数传递变量。否则,您可以使用单例类。没有其他方法。如果希望采用面向对象的方法,通常需要定义一个UserInfo类,该类将保存通过构造函数传入的相关信息。如果需要在不同的用户之间进行更改,最常见的解决方案是将UserInfos存储在一个容器(如HashMap)中,并将其中一个属性(可能是专用属性)作为用户的键。以后,您可以只获取给定用户的信息对象。在大多数情况下,使用静态变量是错误的,不仅是因为它会导致混乱,而且还因为记住它会带来持续的痛苦 不过,也有一些普遍接受的例外情况。如果是静态的,则可以使用记录器 您需要一个会话静态上下文。即一个会话(即登录)的静态上下文Java 如何避免使用静态变量?,java,Java,我对OOP概念很陌生,现在我正在开发一个小系统,它有一个登录系统。我已将用户信息保存在数据库中,当我登录时,我已将其设置为检索用户信息名、权限等,并将其分配给staff类中的一组静态变量,以供以后使用。我想知道是否有办法解决这个问题,在程序登录后运行时保存变量,以便以后在其他表单中使用。我在用户登录时将其分配给静态变量的原因是,我不必每次都检索他的用户信息。例如,如果用户按back键并具有某些特权,我就可以检查要返回到哪个表单。您可以通过构造函数传递变量。否则,您可以使用单例类。没有其他方法。如
class Context {
private static final Context context = new Context();
String userName;
String userPriveliges;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPriveliges() {
return userPriveliges;
}
public void setUserPriveliges(String userPriveliges) {
this.userPriveliges = userPriveliges;
}
public static Context getContext() {
return context;
}
}
一种方法是使用。这允许您以静态方法为代价避免静态字段
public class LoginInfo {
private String username;
private List<String> privileges;
private static INSTANCE = new LoginInfo();
private LoginInfo() {
}
public void initFromDB() {
}
// Everything else is non-static but this
public static getInstance() {
return INSTANCE;
}
}
public class Form1 {
public void doSomething() {
LoginInfo info = LoginInfo.getInstance();
}
}
public class Form2 {
public void doSomething() {
LoginInfo info = LoginInfo.getInstance();
}
}
其他地方:
// The Hollywood Principle - don't call me, I'll call you
public void login() {
LoginInfo loginInfo = new LoginInfo();
form1 = new Form1(loginInfo);
form2 = new Form2(loginInfo);
}
依赖项反转方法的优点是静态变量和方法的副作用,但代价是一些布线。有一些框架,例如,和,可以帮助您完成这一部分
另外,.而不是使用静态使用final。我指的是未草签的决赛。但只有在注销后退出应用程序,它才能工作。如果您在注销后不存在,请使用注册表保存用户。Java内置了注册表,你可以用它来保存任何东西。它还具有密码保护,您可以将该注册表用作web应用程序的cookie。这里有几个链接不清楚你在问什么。这个系统到底是什么?看起来您正在谈论一个web应用程序,但您是否正在使用Tomcat?还是像Play这样的框架?没有更多的信息,就不可能回答。
// The Hollywood Principle - don't call me, I'll call you
public void login() {
LoginInfo loginInfo = new LoginInfo();
form1 = new Form1(loginInfo);
form2 = new Form2(loginInfo);
}