Java-静态变量不同步

Java-静态变量不同步,java,static,Java,Static,哟,, 我想编写一个简单的Messenger(没有网络什么的)来练习我的GUI知识。 然而,我遇到了与账户更新相关的发行人 该课程有4个(针对重要问题)课程。 启动、注册、登录和帐户列表。 开始只是启动注册和登录。 在寄存器中,您可以向AccountList中的静态ArrayList添加值。 登录将ArrayList与输入进行比较。 AccountList保存AccountData的静态ArrayList(另一个类) 现在的问题是,在注册中创建的帐户(ArrayList“值”)不能用于登录。 程

哟,, 我想编写一个简单的Messenger(没有网络什么的)来练习我的GUI知识。 然而,我遇到了与账户更新相关的发行人

该课程有4个(针对重要问题)课程。 启动、注册、登录和帐户列表。 开始只是启动注册和登录。 在寄存器中,您可以向AccountList中的静态ArrayList添加值。 登录将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);
        }

    }
}
}
班级会计清单

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());
    }

}

}
import java.util.*;
公共类帐户列表
{
公共静态数组列表;
公共帐户列表()
{
列表=新的ArrayList();
}
public void addAccount(字符串名称、字符串密码)
{
AccountData nAcc=新的AccountData(名称、密码);
添加列表(nAcc);
}
公开作废印刷品(){
System.out.println(“on”);
对于(会计数据附件:列表){
System.out.println(acc.getName());
}
}
}

您的解决方案的基本问题是AccountList的每个实例都会在构造时替换任何先前存在的“list”值

最简单的“修复”方法就是将列表的构造移动到“列表”的定义中

public static ArrayList<AccountData> list = new ArrayList<AccountData>();
publicstaticarraylist list=newarraylist();
这样,AccountList的所有实例都将共享同一个ArrayList对象

然而,您对AccountList的愿景似乎是作为一个单身者。我建议您仔细阅读如何正确创建Singleton类


最后,单例使为客户机类编写适当的单元测试变得困难。我建议不要使用静态,不要使用单例,切换到像Spring这样的IOC解决方案。

Start
中创建列表,并将其传递到
Register
Login
构造函数中如何?是的,这是一种解决方法。然而,应该有一种方法来解决这个问题。我的意思是,这就是静态背后的含义。问题是你正在替换构造函数中的静态列表。无论哪种方式,静态共享数据都不是好的做法,尤其是不通过实例共享数据。它使它变得不直观、难以维护且容易出错。@JulianHeinisch:在Java中,
static
的意思是“没有任何对象实例的概念或关系”。一般来说,使用静态变量来表示系统的状态是一个非常糟糕的想法。您试图实现,但这样做失败了。