我对OOP概念很陌生,现在我正在开发一个小系统,它有一个登录系统。我已将用户信息保存在数据库中,当我登录时,我已将其设置为检索并将用户信息(名称,权限等)分配给我的员工类中的一组静态变量以供稍后使用。我想知道有没有办法绕过这个,在程序运行后保存变量,登录后以其他形式使用。我在用户登录时将它们分配给静态变量的原因是,每次我需要使用它时,我都不必检索他的用户信息(例如,如果用户按下,则检查要回退的表单)并拥有一定的特权)
答案 0 :(得分:2)
如果你想要这个OOP方式,你通常会定义一个UserInfo
类,它将保存相关信息(通过构造函数传入)。如果需要在不同用户之间进行更改,最常见的解决方案是将UserInfo
存储在容器(如HashMap)中,并将其中一个属性(可能是专用属性)作为用户的关键。稍后您可以get
给定用户的信息对象。
答案 1 :(得分:1)
在大多数情况下,使用static
变量是一个错误,不仅仅是因为它造成的混乱,而且还有记忆它的持续痛苦。
虽然有一些普遍接受的例外。制作static
时可以使用记录器。
您需要session static Context
。即一个会话(即登录)静态的上下文。
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;
}
}
答案 2 :(得分:0)
一种方法是使用Singleton Pattern。这允许您以静态方法为代价来避免静态字段。
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();
}
}
另一种方法是Dependency Inversion。在这种情况下,LoginInfo
的用户以某种方式从外部获取信息。
public class Form1 {
private LoginInfo loginInfo;
public Form1(LoginInfo loginInfo) {
this.loginInfo = loginInfo;
}
public void doSomething() {
}
}
public class Form2 {
private LoginInfo loginInfo;
public Form2(LoginInfo loginInfo) {
this.loginInfo = loginInfo;
}
public void doSomething() {
}
}
其他地方:
// 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);
}
依赖性反演方法的好处是静态变量和方法的恶劣副作用,但代价是某些布线。有Spring,CDI和Guice等框架可以帮助您完成该部分。
答案 3 :(得分:0)
而不是使用静态使用final。我的意思是未初始化的决赛。但它只有在注销后退出应用程序才有效。如果您在注销后不存在,则使用注册表来保存用户。 Java有内置注册表,你可以用它来保存任何东西。它还具有密码保护,您可以将该注册表用作Web应用程序的cookie。以下是一些链接constant-vs-static bad design practice static how to avoid static
答案 4 :(得分:-1)
您可以通过构造函数传递变量。否则你可以使用单例类。别无他法。