Java 如何避免使用静态变量?

Java 如何避免使用静态变量?,java,Java,我对OOP概念很陌生,现在我正在开发一个小系统,它有一个登录系统。我已将用户信息保存在数据库中,当我登录时,我已将其设置为检索用户信息名、权限等,并将其分配给staff类中的一组静态变量,以供以后使用。我想知道是否有办法解决这个问题,在程序登录后运行时保存变量,以便以后在其他表单中使用。我在用户登录时将其分配给静态变量的原因是,我不必每次都检索他的用户信息。例如,如果用户按back键并具有某些特权,我就可以检查要返回到哪个表单。您可以通过构造函数传递变量。否则,您可以使用单例类。没有其他方法。如

我对OOP概念很陌生,现在我正在开发一个小系统,它有一个登录系统。我已将用户信息保存在数据库中,当我登录时,我已将其设置为检索用户信息名、权限等,并将其分配给staff类中的一组静态变量,以供以后使用。我想知道是否有办法解决这个问题,在程序登录后运行时保存变量,以便以后在其他表单中使用。我在用户登录时将其分配给静态变量的原因是,我不必每次都检索他的用户信息。例如,如果用户按back键并具有某些特权,我就可以检查要返回到哪个表单。您可以通过构造函数传递变量。否则,您可以使用单例类。没有其他方法。

如果希望采用面向对象的方法,通常需要定义一个UserInfo类,该类将保存通过构造函数传入的相关信息。如果需要在不同的用户之间进行更改,最常见的解决方案是将UserInfos存储在一个容器(如HashMap)中,并将其中一个属性(可能是专用属性)作为用户的键。以后,您可以只获取给定用户的信息对象。

在大多数情况下,使用静态变量是错误的,不仅是因为它会导致混乱,而且还因为记住它会带来持续的痛苦

不过,也有一些普遍接受的例外情况。如果是静态的,则可以使用记录器

您需要一个会话静态上下文。即一个会话(即登录)的静态上下文

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