将字符串转换为Java中的Type

时间:2013-12-06 18:45:25

标签: 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()函数。但是,name是一个字符串。但我需要使用字符串本身的名称来引用Object。我创建了一个Account leviathan = new Account("Leviathan", "password")name字符串包含leviathan。如何将String的内容转换为帐户,leviathan?

3 个答案:

答案 0 :(得分:0)

就像我在你对这个项目的愿景中犯了一个错误之前告诉过你的那样。 其实你想做

    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等等。

答案 1 :(得分:0)

你将无法实现你想要做的事情。您需要创建一个存储和检索某些数据源帐户的服务。然后,您可以调用该服务并按名称加载您要查找的帐户。

有点像这样:

@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.");
        }
    }
}

此外,作为提示,存储登录凭据时使用散列算法。这将保护密码在数据源中时。当用户登录时,只需哈希他们尝试登录的密码,然后将其与您在数据源中存储的已经哈希的密码进行比较。

答案 2 :(得分:0)

有很多方法可以达到你想要的效果。通过将每个actionlistener放在自己的类中,你已经使自己变得更难了。

您永远不会将“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));
}

Make Control a singleton,让构造函数在创建时创建一个新的ArrayList accountList(或者可能从文件加载它们?)。然后,所有类都可以通过调用Control.addAccount(bla1,bla2)或Control.getAccountByName(“John Prescott”)来访问这些方法。 Joe提到的关于密码散列的要点当然也适用于此。