我有一个复习课,我曾经在另一个叫做游戏信息的课程中创建一个数组。
我创建了一个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;
}
}
}
}
答案 0 :(得分:3)
我只是想确保我对addReview方法的逻辑是正确的。
不,两个问题:
您需要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;
}
addReview
会无声地失败。你想要大声失败:-)或者创建一个更大的新阵列,将旧阵列复制到它上面,然后添加到最后。
数组可能不是理想的选择,您可能希望使用List<Review>
代替(您可以使用ArrayList<Review>
或LinkedList<Review>
进行初始化,无论适合哪种情况)。这会简单得多。但我不知道设计限制。
旁注:您的Review
有公共字段。通常在Java中被认为不是最佳实践;请考虑使用私有字段和访问方法。