如何避免使用静态变量?

时间:2015-10-08 13:23:26

标签: java

我对OOP概念很陌生,现在我正在开发一个小系统,它有一个登录系统。我已将用户信息保存在数据库中,当我登录时,我已将其设置为检索并将用户信息(名称,权限等)分配给我的员工类中的一组静态变量以供稍后使用。我想知道有没有办法绕过这个,在程序运行后保存变量,登录后以其他形式使用。我在用户登录时将它们分配给静态变量的原因是,每次我需要使用它时,我都不必检索他的用户信息(例如,如果用户按下,则检查要回退的表单)并拥有一定的特权)

5 个答案:

答案 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);
}

依赖性反演方法的好处是静态变量和方法的恶劣副作用,但代价是某些布线。有SpringCDIGuice等框架可以帮助您完成该部分。

另外,Singletons are Pathalogical Liars

答案 3 :(得分:0)

而不是使用静态使用final。我的意思是未初始化的决赛。但它只有在注销后退出应用程序才有效。如果您在注销后不存在,则使用注册表来保存用户。 Java有内置注册表,你可以用它来保存任何东西。它还具有密码保护,您可以将该注册表用作Web应用程序的cookie。以下是一些链接constant-vs-static bad design practice static how to avoid static

答案 4 :(得分:-1)

您可以通过构造函数传递变量。否则你可以使用单例类。别无他法。