在没有的情况下在另一个类的对象上调用方法

时间:2016-10-27 19:52:04

标签: java arraylist

我有三个课程:UserUserManagement(包含用户的arraylist)和LoginController

public class UserManagement {
    //Create an arraylist that stores users
    ArrayList<User> users;

    public UserManagement() {
        users = new ArrayList<User>();
    }

    public void addUser(String userName, String fullName, String password) {
        users.add(new User(userName, fullName, password));
    }

    public void listAllUsers() {
        for (User user : users) {
            System.out.println(user.printUserInfo());
        }
    }

    /**
     *
     * @param userName username to be searched for
     * @param password password to be searched for
     * @ return boolean for check of username/password
     */
    public boolean checkUser(String userName, String password)  {
        int index = 0;
        boolean searching = true;
        boolean match = false;
        while (searching && index < users.size()) {
            String u = users.get(index).getUsername();
            String p = users.get(index).getPassword();
            if (u.equals(userName) && p.equals(password)) {
                //its a match
                match = true;
            }
            else {
                // continue searching
                index++;
            }
        }
        return match;
    }
}

public class LoginController implements Initializable, ControlledScreen {
    @FXML
    Button loginButton;

    @FXML
    private TextField login;

    @FXML
    private PasswordField password;

    ScreensController myController;

    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }

    public void setScreenParent(ScreensController screenParent) {
        myController = screenParent;
    }

    @FXML
    private void handleButtonAction(ActionEvent event) {
        UserManagement.users.checkUser(login.getText(), password.getText());
        //something like this? ^
    }
}

我想要做的是使用checkUser类中存储的变量调用方法LoginController。显然,每当我想查看登录详细信息时,我都不想创建一堆arraylists。有没有办法在UserManagement中对arraylist这样做,而不是每次都创建一个新的arraylist? LoginController中的最后一个方法可以更好地了解我想要实现的目标。

2 个答案:

答案 0 :(得分:0)

UserManagement.users.checkUser(login.getText(), password.getText());

将无效,因为用户被定义为UserManagement类中的成员变量。而UserManagement.users试图获取类变量。

这是一个链接,告诉你区别:

http://www.programmerinterview.com/index.php/c-cplusplus/whats-the-difference-between-a-class-variable-and-an-instance-variable/

快速修复:

1)在LoginController类中实例化UserManagement实例。

public class LoginController implements Initializable, ControlledScreen {
    @FXML
    Button loginButton;

    @FXML
    private TextField login;

    @FXML
    private PasswordField password;

    ScreensController myController;

    UserManagement usrMgmt = new UserManagement();
    ....

然后你可以这样做:

@FXML
    private void handleButtonAction(ActionEvent event) {
        usrMgmt.checkUser(login.getText(), password.getText());
        //something like this? ^
    }

答案 1 :(得分:-1)

一些提示:

1)不要在UserManagement类的构造函数中初始化ArrayList。想象它&#34;每当有人实例化该类时,将创建一个新的arraylist ......我想要那个吗?&#34;

这是不合适的,也是不必要的空间使用。这里的解决方案是让它像一个属性,并有它的getter和setter。 这将解决每次调用构造函数时创建ArrayList的类设计基础。

private ArratList<User>; {get;set;}

2)在checkUser()函数中,您检查是否存在所有用户及其密码。永远不要那样做。 相反,选择用户并检查他是否存在,然后检查他的密码是否正确。适当地返回结果(分离错误,如用户不存在或密码错误等)。