数组的setter方法

时间:2016-09-05 17:22:08

标签: java arrays class oop

我有一个复习课,我曾经在另一个叫做游戏信息的课程中创建一个数组。

我创建了一个setter方法,用于向gameInfo的评论数组添加评论。我有addReview功能来搜索此游戏评论,如果有一个空的评论位置,则将评论输入添加到评论数组中。我只想确保addReview方法的逻辑正确。

class Review {
    //review class variables
    public String reviewText;
    public int numberOfStars;

    //review class constructor
    public Review(String reviewText, int numberOfStars) {
        this.reviewText=reviewText;
        this.numberOfStars=numberOfStars;
    }
}

class GameInfo {
    //game info class variables
    private String title;
    private Review[] reviews = new Review[10];

    //game info class constructor
    public GameInfo(String title, Review[] reviews) {
        this.title=title;
        this.reviews = reviews;
    }

    //setter to add single review to reviews[]
    public void addReview(Review r) {
        int i;
        for(i = 0; i < this.reviews.length; i++)    {
            if(this.reviews[i] == null) {
                this.reviews[i].reviewText = r.reviewText;
                this.reviews[i].numberOfStars = r.numberOfStars;
                break;
            }
        }
    }
}

1 个答案:

答案 0 :(得分:3)

  

我只是想确保我对addReview方法的逻辑是正确的。

不,两个问题:

  1. 您需要null,但之后尝试分配null上的字段:

    if(this.reviews[i] == null) {
        this.reviews[i].reviewText = r.reviewText; 
        this.reviews[i].numberOfStars = r.numberOfStars;
        break;
    }
    

    ...因为您尝试在reviewText上设置属性null的值,因此会抛出NPE。您需要创建一个Review(或使用传入的那个,具体取决于API设计以及它是否可变)。

    如果您的Review是不可变的(一旦创建就无法更改),我们可以安全地使用传入的实例:

    if(this.reviews[i] == null) {
        this.reviews[i] = r;
        break;
    }
    

    但由于它可变(可以改变),我们需要创建我们自己的(大概):

    if(this.reviews[i] == null) {
        this.reviews[i] = new Review(r.reviewText, r.numberOfStars);
        break;
    }
    

    在那里,我将离散的参数传递给Review构造函数;我宁愿将复制构造函数添加到Review,然后执行此操作:

    if(this.reviews[i] == null) {
        this.reviews[i] = new Review(r);
        break;
    }
    
  2. 如果阵列已满,
  3. addReview会无声地失败。你想要大声失败:-)或者创建一个更大的新阵列,将旧阵列复制到它上面,然后添加到最后。

    数组可能不是理想的选择,您可能希望使用List<Review>代替(您可以使用ArrayList<Review>LinkedList<Review>进行初始化,无论适合哪种情况)。这会简单得多。但我不知道设计限制。

  4. 旁注:您的Review有公共字段。通常在Java中被认为不是最佳实践;请考虑使用私有字段和访问方法。