-3

I'm quite new to OOP concepts, and right now I am developing a small system, it has a login system. I have saved the user info in a database, and when I log in, I have made it so it retrieves and assigns the user info(name, privileges, etc) to a set of static variables in my staff class to use later. I was wondering is there a way around this, to save the variables while the program is running after log in to be used later in other forms. The reason I assigned them to static variables while the user has logged in, is so that I don't have to retrieve his user info everytime I need to use them(for example to check which form to fall back to if the user presses back and has certain privileges)

EidolonMK
  • 313
  • 2
  • 9
  • 1
    It is unclear what you are asking. What is the system exactly ? It seems like you are talking about a web application, but are you maybe using Tomcat ? Or a framework like Play ? Without more information, it is impossible to answer. – SirDarius Oct 08 '15 at 13:25

5 Answers5

2

If you want this the OOP way, you would typically define a UserInfo class, which will hold the relevant information (passed in via constructor). If you need to change between different users, the most common solution would be to store the UserInfos in a container such as a HashMap, and have one of the attributes (possibly a dedicated one) act as key to the users. Later you can just get the information object for a given user.

midor
  • 5,487
  • 2
  • 23
  • 52
1

In most cases using static variables is a mistake, not just for the clutter it causes but for the on-going pain of remembering it.

There are some generally accepted exceptions though. Loggers are acceptable when made static.

You are in need of a session static Context. I.e. a context that is static for one session (i.e. login).

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;
    }
}
OldCurmudgeon
  • 64,482
  • 16
  • 119
  • 213
0

One approach is to use the Singleton Pattern. This allows you to avoid static fields at the cost of a static method.

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 other approach is Dependency Inversion. In this case, the users of LoginInfo get the information from outside, somehow.

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() {
    }
}

Somewhere else:

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

The Dependency Inversion approach has the benefit of the nasty side effects of static variables and methods, at the cost of some wiring. There are frameworks such as Spring, CDI and Guice that help you with that part.

Also, Singletons are Pathalogical Liars.

sh0rug0ru
  • 1,596
  • 9
  • 9
0

Instead of using static use final. I mean un-initialised final. But it will work only if after logged offing you exit from application. If you are not existing after logged off then use registry to save users. Java has inbuilt registry, you can use it to save anything. It also has password protection, and you can use that registry as cookies of web applications. Here are few linksconstant-vs-staticbad design practice statichow to avoid static

Community
  • 1
  • 1
-1

You can pass variables through constructors. Otherwise you can use a singleton class. There's no other way.

Joshua Bakker
  • 2,288
  • 3
  • 30
  • 63