0

携帯電話をエミュレートする非常に単純な GUI プログラムを作成しています。「携帯電話」には、電話、連絡先、メッセージ、アプリの 4 つの主要なボタンがあります。すべての GUI をコーディングしましたが、プログラム全体のバックボーンである Contact クラスの作業中に問題が発生しました。

Contact クラスは非常に単純で、'name' と 'number' という String 型の 2 つのインスタンス変数があります。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

0

コメントとして投稿するには長すぎるため、これを回答として投稿します。すでに回答されたポイントとは別に、ここにいくつかの観察結果を追加したいと思います。

コードに特定の間違いがあります (意図しない場合):

namenumber両方を として宣言していstaticます。それが行うことは、クラスのすべてのインスタンスが同じandContactを共有することです. すべての連絡先が同じであると思いますが、これは前例のない、意図しないものです。namenumbernamenumber

public static String name, number;

だからそれを修正する

public String name, number;

これは警告のようなものですが、 Serializable class に を提供する必要がserialVersionUIDありますシリアライゼーション ランタイムは、シリアライズ可能な各クラスに、serialVersionUID と呼ばれるバージョン番号を関連付けます。これは、シリアライズされたオブジェクトの送信者と受信者がロードしたことを確認するために、デシリアライゼーション中に使用されます

public static final long serialVersionUID = 42L;

equals()の定義により、問題が発生します。2==つの等価性をチェックするために使用している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 に答える
0

あなたが達成しようとしていることを本当に理解していることを恐れていますが、あなたのコードには 2 つの問題があります。

  1. Contact クラスを静的属性で作成しました。これは、すべてのオブジェクトが名前と番号の同じ値を共有することを意味します。問題があるようです。共有する必要がないように思われる場合は、非静的属性を作成することをお勧めします。

public static 文字列名、番号。

クラスの 2 番目の問題は、連絡先の配列リストもその中に入れたことです。そして、クラスをシリアライズ可能にしました。これは、連絡先オブジェクトをシリアル化するたびに、配列リストも一緒にシリアル化されることを意味しますが、これは望ましくないと思います。別のクラスを作成し、ContactsCollection などの名前を付けて、その中に Arraylist を作成する必要があります。ここで静的な arraylist を選択することもできます。

GUI でオブジェクトを作成する場合は、Contact のインスタンスを作成します。そして、それを ContactsCollection.contactList() に追加するだけです。ContactsColleciton クラスにもシリアル化するメソッドを追加できます。ContactsCollection に、Contact オブジェクトとして引数を持つ単一のメソッドを持つことを選択できます。最初にリストにオブジェクトを追加してから、それをシリアル化します。

于 2013-05-14T06:03:29.967 に答える