0

我正在编写一个非常简单的程序 GUI 程序来模拟手机。“手机”有四个主要按钮:电话、联系人、消息和应用程序。我已经编写了所有的 GUI 代码并在处理 Contact 类时遇到了问题,这是整个程序的支柱!

Contact 类非常简单,它有两个 String 类型的实例变量,分别是“name”和“number”。我想构建一个 Contact 类型的 ArrayList,允许添加联系人,然后创建方法以附加到序列化文件并从中读取。

在这一点上,我非常坚持如何创建将对象添加到 arrayList 的方法,然后创建附加到序列化文件并从序列化文件中读取的方法。

这是联系人类:

public class Contact
{
    public String name, number;

Contact()
{}

Contact (String theName, String theNumber)
{
    this.name = theName;
    this.number = theNumber;
}

public void setName(String aName)
{
    this.name = aName;
}

public void setNumber(String aNumber)
{
    this.number =aNumber;
}

public String getName()
{
    return name;
}

public String getNumber()
{
    return number;
}

public String toString()
{
    return name + ": " + number;
}

public boolean equals(Contact other)
{
   if (name.equals(other.getName())  && number.equals(other.getNumber()))
   {
      return( true );
   }
   else
   {
      return( false );
   }
}
}

感谢您的快速回复。我已经更正了 equals 方法并将 ArrayList 移到了它自己的类中。我还清除了 read 方法的错误(Java 7 问题)。我遇到的当前问题是在这些方面:

out.writeObject(contact);

Contact contact = (Contact)in.readObject();

由于我正在尝试写入和读取 ArrayList,这些方法不应该反映这一点吗?

import java.util.*;
import java.io.*;

class ContactsCollection implements Serializable
{
    public static final long serialVersionUID = 42L;

ArrayList <Contact> contactList = new ArrayList<Contact>();

public void write()
{
    try 
    {
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("contactList.dat"));
        out.writeObject(contact);
    } 
    catch(IOException e)
    {
        e.printStackTrace();
    }
}

public void read()
{
    try
    {
         ObjectInputStream in = new ObjectInputStream(new FileInputStream("contactList.dat"));
         Contact contact = (Contact)in.readObject();
    } 
    catch (IOException e)
    {
        e.printStackTrace();
    }
    catch (ClassNotFoundException e)
    {
        e.printStackTrace();
    }
}
}
4

3 回答 3

2

附加到列表就像list.add(contact).

写入序列化:

try {
    ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream(file));
    out.writeObject(contact);
} catch(IOException e) {
    e.printStackTrace();
}

阅读:

try {
    ObjectInputStream in = new ObjectInputStream(new FileInputStream(file));
    Contact contact = (Contact)in.readObject();
} catch(IOException | ClassNotFoundException e ) {
    e.printStackTrace();
}
于 2013-05-14T05:55:11.763 回答
0

恐怕我真的了解您要实现的目标,但我可以在您的代码中看到两个问题:

  1. 您已经创建了具有静态属性的联系人类,这意味着所有对象将共享相同的名称和号码值。这似乎有问题,我会建议您在似乎不需要共享它们时创建非静态属性。

公共静态字符串名称,数字;

你班上的第二个问题是你也把联系人的数组列表放在里面。你已经让这个类可串行化了。这意味着每次您序列化您的联系人对象时,您的数组列表也将随之序列化,我认为这是不希望的。您应该创建另一个类并将其命名为 ContactsCollection 并简单地在其中创建一个 Arraylist,您可以选择在此处使用静态数组列表。

在您的 GUI 中,如果您正在创建对象,则创建一个 Contact 实例。然后只需将其添加到您的 ContactsCollection.contactList()。您也可以在 ContactsColleciton 类中添加序列化方法。您可以选择在 ContactsCollection 中使用单个方法,并将参数作为 Contact 对象。首先将对象添加到列表中,然后对其进行序列化。

于 2013-05-14T06:03:29.967 回答
0

作为评论发布会太长,因此我将其发布为答案。除了已经回答的要点,我想在这里添加一些我的观察。

您的代码中存在某些错误(如果它们是无意的):

您声明nameandnumber都为static. 它的作用是你的类的所有实例Contact将共享相同的nameand number。我认为所有联系人都具有相同的内容name,并且number是非常前所未闻和无意的。

public static String name, number;

所以纠正它

public String name, number;

虽然这更像是一个警告,但您应该为serialVersionUID您的Serializable类提供一个。序列化运行时与每个可序列化类关联一个版本号,称为 serialVersionUID,在反序列化期间用于验证序列化对象的发送方和接收方是否已加载

public static final long serialVersionUID = 42L;

您对equals()的定义将产生问题。您==用于检查两个的相等性,String而这反过来只会检查相等的引用。更好的方法是使用覆盖的equals()String比较内容。

if (name.equals(other.getName())  && number.equals(other.getNumber()))
{
    return true;
}
else
{
   return false;
}

一旦你覆盖了equals()Contact,也覆盖了它的hashCode()

于 2013-05-14T06:24:33.337 回答