簡體   English   中英

將字符串轉換為Java類型

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM