0

String、String、int、String、boolean を受け取る Review というインスタンス クラスがあります。

ユーザーがこれらの 5 つすべてに値を入力するたびに、メインの arrayList に追加されます。ここでの私の問題は、ユーザーが値を更新すると、配列リスト内の値も変更され、最終的に配列リスト内のすべてのレビューが同じになることです。Review クラスには何も静的なものはありません。どうすればこの問題を解決できますか?

public class Review implements Comparable<Review>{
  private String reviewer;
  private String restaurant;
  private int rating;
  private String comment;
  private boolean recommended;
  public Review( String revName, String restName, int rating, String comment, boolean recommended) {
    reviewer = revName;
    restaurant = restName;
    this.rating = rating;
    this.comment = comment;
    this.recommended = recommended; 
  }

これはコンストラクター付きの基本クラスで、すべて独自のゲッターとセッターを持っています。

private ArrayList<Review> reviews = new ArrayList<Review>();

Review review = new Review(revName, restName, rating, comment, recommended);

public void setReviews(Review review){
  reviews.add(review);
}
public ArrayList<Review> getReviews(){
    return reviews;
}

これは、インポートおよびエクスポート用の別のクラスです。(以降、このクラスを「リーダー」クラスと呼びます)

主に私はちょうど使用します

    ArrayList<Review> reviews = reader.getReviews();

更新があるたびにそれらを互いに等しく設定する

    reader.setReviews(review);

これは、ユーザーによる 5 回の入力すべての後に使用されます。ユーザーは、Review クラスの個々の変数に対してセッターを使用して値を設定します。

4

1 に答える 1

0

あなたの問題

これを宣言すると:

Object o = new Object();

操作する値は、そのオブジェクトへのポインターです。オブジェクトそのものではありません。したがって、複数のオブジェクトを に追加するつもりでArrayListあっても、オブジェクト自体を追加するわけではありません。pointersこれらのオブジェクトに追加するだけです。したがって、 内のアイテムごとに新しいオブジェクトが必要ですArrayList。なんで?

SomeClass s = new SomeClass();
SomeClass a = s;

a.setName("Hello"); // Sets the object's name value that a points to.
s.getName(); // Will return "Hello".

これは、asの両方が同じオブジェクトを指しているためです。

他のもの

あなたのコンストラクタ

読み取り可能なコードの重要な要素の 1 つは、一貫性です。ある方法で何かを行う場合、それがプログラムの機能に影響を与えないのであれば、常にその方法で行ってください。その原則に従わない例を次に示します。

reviewer = revName;
restaurant = restName;

残りのコンストラクタは次のようになります。

this.rating = rating;
this.comment = comment;
this.recommended = recommended; 

後者の部分は、コンストラクターでより一般的に使用されるコードです。パターンに適合するように、最初の部分を変更することをお勧めします。

this.reviewer = reviewer;
this.restaurant = restaurant;

オブジェクト宣言

Review review = new Review(revName, restName, rating, comment, recommended);

このコードの目的が本当にわかりません。または、少なくとも、提供されたコードからは明らかではありません。

于 2013-05-10T19:15:46.227 に答える