Java - 静态变量不同步

时间:2017-06-15 22:20:05

标签: java static

哟, 我想编写一个简单的Messenger(带有网络和其他东西)来练习我的GUI - 知识。 但是,我遇到了与账户更新有关的发行人。

该程序有4个(对于重要的问题)类。 启动,注册,登录和帐户列表。 开始只需启动注册和登录。 在Register中,您可以将值添加到AccountList中的静态ArrayList。 Login将ArrayList与输入进行比较。 AccountList保存AccountData的静态ArrayList(另一个类)。

现在的问题是,在注册表创建的帐户(ArrayList"值")中无法在登录中使用。 本程序在两个类中创建类帐户列表的对象。

...
AccountList list;

public Register()
{
    list = new AccountList();
...

由于Login类将在Register类之后调用,是否应更新静态ArrayList?

这是四个类的代码:

课程开始

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Start extends JFrame implements ActionListener
{

JButton bRegister;
JButton bLogin;

public static void main(String[] args)
{
    Start start = new Start();
}

   public Start()
   {
    setSize(400,400);
    setResizable(true);
    setVisible(true);
    setTitle("Start");
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    FlowLayout mgr = new FlowLayout();
    setLayout(mgr);
    Container cp = getContentPane();

    bRegister = new JButton("Register");
    bRegister.addActionListener(this);
    cp.add(bRegister);

    bLogin = new JButton("Log in");
    bLogin.addActionListener(this);
    cp.add(bLogin);

}

public void reopen(){
    setVisible(true);
}

public void actionPerformed (ActionEvent evt)
{
    if (evt.getSource() == bRegister){
        Register r = new Register();

        setVisible(false);
    }
    else if(evt.getSource() == bLogin){

        Login l = new Login();

        setVisible(false);
    }
}

}

班级注册:

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Register extends JFrame implements ActionListener
{

JLabel lName; 
JTextField tName;

JLabel lPassword;
JPasswordField tPassword;

JButton addAcc;

AccountList list;

public Register()
{
    list = new AccountList();
    Create();
}

private void Create()
{
    setSize(400,400);
    setResizable(true);
    setVisible(true);

    setTitle("Register");
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    FlowLayout mgr = new FlowLayout();
    setLayout(mgr);
    Container cp = getContentPane();

    lName = new JLabel("Name:");
    cp.add(lName);

    tName = new JTextField(20);
    cp.add(tName);

    lPassword = new JLabel("Password:");
    cp.add(lPassword);

    tPassword = new JPasswordField(20);
    cp.add(tPassword);

    addAcc = new JButton("Confirm");
    addAcc.addActionListener(this);
    cp.add(addAcc);
}

public void actionPerformed (ActionEvent evt)
{
    if (evt.getSource() == addAcc){

        String name = tName.getText();
        String password = new String(tPassword.getPassword());

        list.addAccount(name, password);

        setVisible(false);
        dispose();


        Start start = new Start();

    }
}

课程登录:

}

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Login extends JFrame implements ActionListener
{

JLabel lName; 
JTextField tName;

JLabel lPassword;
JPasswordField tPassword;

JButton confirm;

AccountList list;   

public Login(){
    list = new AccountList();
    Create();
}

private void Create()
{
    setSize(400,400);
    setResizable(true);
    setVisible(true);

    setTitle("Login");
    setDefaultCloseOperation(EXIT_ON_CLOSE);

    FlowLayout mgr = new FlowLayout();
    setLayout(mgr);
    Container cp = getContentPane();

    lName = new JLabel("Name:");
    cp.add(lName);

    tName = new JTextField(20);
    cp.add(tName);

    lPassword = new JLabel("Password:");
    cp.add(lPassword);

    tPassword = new JPasswordField(20);
    cp.add(tPassword);

    confirm = new JButton("Confirm");
    confirm.addActionListener(this);
    cp.add(confirm);

    list.print();
}

public void actionPerformed (ActionEvent evt)
{
    if (evt.getSource() == confirm){

        String inName = tName.getText();
        String inPassword = new String(tPassword.getPassword());
        AccountData user = null;

        for (AccountData acc : list.list){
            if (inName.equals(acc.getName())){
                user = acc;
            }
        }

        if (user != null){
            if (inPassword != user.getPassword()){
                System.out.println("go to inbox");//to change
            }
            else{
                JOptionPane.showMessageDialog(null, "Check the Password", "Wrong Password", JOptionPane.INFORMATION_MESSAGE);
            }
        }
        else{
            JOptionPane.showMessageDialog(null, "Check the Name", "Missing Name", JOptionPane.INFORMATION_MESSAGE);
        }

    }
}
}

类AccountList

import java.util.*;

public class AccountList
{

public static ArrayList<AccountData> list;

public AccountList()
{
    list = new ArrayList<AccountData>();
}

public void addAccount(String name, String password)
{
    AccountData nAcc = new AccountData(name , password);
    list.add(nAcc);

}

public void print(){
    System.out.println("on");
    for (AccountData acc: list){
        System.out.println(acc.getName());
    }

}

}

1 个答案:

答案 0 :(得分:2)

您的解决方案的根本问题是AccountList的每个实例都会替换任何预先存在的&#39; list&#39;在施工。

最简单的解决方法&#39;只是将列表的构造移动到&#39; list&#39;。

的定义
public static ArrayList<AccountData> list = new ArrayList<AccountData>();

这样,AccountList的所有实例都将共享相同的ArrayList对象。

但是,您对AccountList的愿景似乎是单身。我建议您阅读如何正确创建Singleton类。

最后,Singletons很难为客户端类编写适当的单元测试。我建议不要使用静态,不要单身,并切换到像I春天这样的IOC解决方案。