我對OOP的概念很陌生,現在我正在開發一個小系統,它有一個登錄系統。我已經將用戶信息保存在數據庫中,並且在登錄時,我已經完成了它,它將檢索並將用戶信息(名稱,權限等)分配給我的員工類中的一組靜態變量,以供以後使用。我想知道是否有解決這個問題的方法,以便在程序運行後保存變量,以便以後以其他形式使用。我在用戶登錄時將它們分配給靜態變量的原因是,我不必在每次需要使用它時都檢索其用戶信息(例如,檢查用戶是否按下了回退的表單並有一定的權限)如何避免使用靜態變量?
-3
A
回答
-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);
}
依賴倒置方法具有靜態變量和方法的討厭的副作用的利益,在一些佈線成本。有框架,如Spring,CDI和Guice,可以幫助您完成該部分。另外,Singletons are Pathalogical Liars。
0
而不是使用靜態使用final。我的意思是未初始化的決賽。但只有在退出應用程序後才能使用。如果註銷後不存在,則使用註冊表保存用戶。 Java具有內置註冊表,您可以使用它來保存任何內容。它也有密碼保護,您可以使用該註冊表作爲Web應用程序的Cookie。這裏有幾條鏈接constant-vs-staticbad design practice statichow to avoid static
相關問題
- 1. ASP.NET MVC如何避免靜態變量?
- 2. 如何釋放TextToSpeech的靜態變量以避免泄漏?
- 3. 如何避免在C++中使用非原始靜態類變量的問題?
- 4. 如何避免time_t變量?
- 5. PHPMD - 避免使用類的靜態訪問 - 使用常量?
- 6. 如何避免需要變量變量?
- 7. 避免與靜態參數
- 8. 避免靜態變量的解決方案
- 9. 避免定義,但不使用靜態常量類
- 10. 在Android對話框中使用列表 - 如何避免靜態?
- 11. 如何避免靜態成員函數與C++使用gsl
- 12. 如何構建我的類以避免使用靜態函數
- 13. Java中,正確使用靜態變量,以避免死鎖 - 同步
- 14. 如何使靜態變量動態?
- 15. 避免從靜態上下文引用
- 16. 如何在靜態NestedClass中使用非靜態的OuterClass變量?
- 17. 避免靜態和動態鑄造
- 18. android:使用靜態變量
- 19. 使用靜態變量
- 20. 使用DataContext靜態變量
- 21. Codeigniter:使用靜態變量
- 22. 在C99中使用靜態變量初始化靜態變量
- 23. 如何避免全局變量
- 24. 如何避免重複變量?
- 25. React + Flux - 如何避免全局變量
- 26. 如何避免全局屏幕變量?
- 27. 如何避免在angularjs冗餘變量
- 28. 如何避免sprintf的加盟變量
- 29. 全局變量,如何避免它們
- 30. 避免使用狀態變量副本進行阻塞?
目前還不清楚你在問什麼。什麼是系統?看起來你正在談論一個Web應用程序,但你可能使用Tomcat?或者像Play這樣的框架?沒有更多的信息,這是不可能回答的。 – SirDarius