[英]Convert String to Type in Java
我有一堂課:
public Account(String name, String passwd)
{
this.name = name;
this.passwd = passwd;
}
public String getName()
{
return name;
}
public String getPasswd()
{
return passwd;
}
private String name;
private String passwd;
我也有這節課:
public class CreateAccountAction implements ActionListener
{
@Override
public void actionPerformed(ActionEvent arg0)
{
Account newAccount = new Account(GameGUI.textField.getText(), GameGUI.passwordField.getText());
Logger.send("You have created an account with the username, "+newAccount.getName()+".");
}
}
現在,我還有一堂課:
public class LogInAction implements ActionListener
{
@Override
public void actionPerformed(ActionEvent arg0)
{
String name = GameGUI.textField.getText();
if(GameGUI.passwordField.getText().equalsIgnoreCase(name.getPasswd()))
{
Logger.send("You have logged in.");
loggedIn = true;
}
else
{
Logger.send("Incorrect password.");
}
}
public boolean loggedIn()
{
return this.loggedIn;
}
private boolean loggedIn = false;
}
所以。 在第三課中,我試圖在第一課中使用name.getPasswd()
函數。 但是,名稱是一個字符串。 但是我需要使用字符串本身的名稱來引用對象。 我創建了一個Account leviathan = new Account("Leviathan", "password")
。 並且name
String包含leviathan
。 我如何將String的內容轉換為leviathan帳戶?
就像我之前告訴過您的那樣,您對程序的看法有誤。 其實你想做
String name = GameGUI.textField.getText();
if(GameGUI.passwordField.getText().equalsIgnoreCase(name.getPasswd()))
但這是行不通的,因為name聲明為String而不是Account,因此您不能在此請求getPasswd()方法。
若要更正,您可以嘗試在LogInAction中創建這樣的方法,例如
public Account getAccountFromName(String name)
{
// your code to get the account
}
並且您的代碼將在
String name = GameGUI.textField.getText();
Account acc = getAccountFromName(name);
if(GameGUI.passwordField.getText().equalsIgnoreCase(acc.getPasswd()))
但是,對於所有這些,您將必須具有現有帳戶的arrayList。 為此,您必須在CreateAccountAction中更改代碼。 您將需要添加例如accList等。
您將無法實現您想要做的事情。 您將需要創建一個服務,該服務用於存儲和檢索來自某些數據源的帳戶。 然后,您可以調用該服務並按名稱加載您要查找的帳戶。
看起來像這樣:
@Override
public void actionPerformed(ActionEvent arg0)
{
AccountService accountService = new AccountService();
Account account = accountService.getAccountByName(GameGUI.textField.getText());
if (account == null) {
Logger.send("Account name does not exist.");
} else {
if(GameGUI.passwordField.getText().equalsIgnoreCase(account.getPasswd()))
{
Logger.send("You have logged in.");
loggedIn = true;
}
else
{
Logger.send("Incorrect password.");
}
}
}
另外,作為提示,在存儲登錄憑據時,請使用哈希算法。 當密碼在數據源中時,這將保護密碼。 用戶登錄時,只需對嘗試登錄的密碼進行哈希處理,然后將其與您存儲在數據源中的已哈希化密碼進行比較即可。
有很多方法可以實現您想要的。 通過將每個動作偵聽器置於自己的類中,您會變得更加困難。
您永遠不會在任何地方保存“ newAccount”變量,因此該變量僅在actionPerformed結束之前存在。 要使用GUI處理任何類型的數據,您應該考慮創建一個新類,並將其命名為Controller,並將數據保留在其中。 然后,您可以在控制器中將ArrayList作為變量,這是當前已知用戶的列表(Account-objects的列表)。 我們稱它為accountList。
然后,此Control類具有以下方法:
public static Account getAccountByName(String name){
// do some looping to find the account
}
public static boolean checkIfNameAlreadyExists(){
// make for-loop to check if name is in use
}
public static void addAccount(String name, String passwd){
accountList.add(new Account(name, passwd));
}
使Control為單例 ,並讓構造函數在創建時創建一個新的ArrayList accountList(或可能從文件中加載它們?)。 然后,您所有的類都可以通過調用Control.addAccount(bla1,bla2)或Control.getAccountByName(“ John Prescott”)訪問這些方法。 喬提到的有關密碼散列的要點在這里當然也有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.