0

我有一个名为 Review 的实例类,它接受 String、String、int、String、boolean。

每次用户输入所有 5 个值时,它都会添加到 main 中的 arrayList。我的问题是,当用户更新值时,它也会更改 arraylist 中的值,最终,arraylist 中的所有 Review 都相同。我在 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; 
  }

这是带有构造函数的基本类,它们都有自己的 getter 和 setter。

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 类中的各个变量使用 setter 来设置值。

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指向同一个对象

其他的东西

你的构造函数

可读代码的关键要素之一是一致性。如果您以一种方式做某事,那么如果它不影响程序的功能,请始终以这种方式进行。您不遵循该原则的一个示例如下:

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 回答