Java-静态变量不同步
哟,, 我想编写一个简单的Messenger(没有网络什么的)来练习我的GUI知识。 然而,我遇到了与账户更新相关的发行人 该课程有4个(针对重要问题)课程。 启动、注册、登录和帐户列表。 开始只是启动注册和登录。 在寄存器中,您可以向AccountList中的静态ArrayList添加值。 登录将ArrayList与输入进行比较。 AccountList保存AccountData的静态ArrayList(另一个类) 现在的问题是,在注册中创建的帐户(ArrayList“值”)不能用于登录。 程序在这两个类中创建类帐户列表的对象Java-静态变量不同步,java,static,Java,Static,哟,, 我想编写一个简单的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
的意思是“没有任何对象实例的概念或关系”。一般来说,使用静态变量来表示系统的状态是一个非常糟糕的想法。您试图实现,但这样做失败了。