2015-10-08 135 views
-3

我對OOP的概念很陌生,現在我正在開發一個小系統,它有一個登錄系統。我已經將用戶信息保存在數據庫中,並且在登錄時,我已經完成了它,它將檢索並將用戶信息(名稱,權限等)分配給我的員工類中的一組靜態變量,以供以後使用。我想知道是否有解決這個問題的方法,以便在程序運行後保存變量,以便以後以其他形式使用。我在用戶登錄時將它們分配給靜態變量的原因是,我不必在每次需要使用它時都檢索其用戶信息(例如,檢查用戶是否按下了回退的表單並有一定的權限)如何避免使用靜態變量?

+1

目前還不清楚你在問什麼。什麼是系統?看起來你正在談論一個Web應用程序,但你可能使用Tomcat?或者像Play這樣的框架?沒有更多的信息,這是不可能回答的。 – SirDarius

回答

-1

您可以通過構造函數傳遞變量。否則,你可以使用單例類。沒有別的辦法。

2

如果您想要這種OOP方式,您通常會定義一個UserInfo類,它將保存相關信息(通過構造函數傳入)。如果您需要在不同用戶之間進行切換,最常見的解決方案是將UserInfo存儲在諸如HashMap之類的容器中,並將其中一個屬性(可能是專用的)作爲用戶的關鍵字。稍後,您可以僅爲給定用戶的信息對象get

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

0

而不是使用靜態使用final。我的意思是未初始化的決賽。但只有在退出應用程序後才能使用。如果註銷後不存在,則使用註冊表保存用戶。 Java具有內置註冊表,您可以使用它來保存任何內容。它也有密碼保護,您可以使用該註冊表作爲Web應用程序的Cookie。這裏有幾條鏈接constant-vs-staticbad design practice statichow to avoid static