我有一个复习类,用于在另一个名为游戏信息的类中创建一个数组。
我创建了一个 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;
}
}
}
}
最佳答案
I just want to be sure that I have the logic correct for the addReview method.
不,有两个问题:
您正在寻找
null
, 但随后尝试分配给null
上的字段:if(this.reviews[i] == null) { this.reviews[i].reviewText = r.reviewText; this.reviews[i].numberOfStars = r.numberOfStars; break; }
...这将抛出 NPE,因为您正在尝试设置一个属性的值,
reviewText
, 关于null
.你需要创建一个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
有公共(public)领域。通常在 Java 中,这被认为不是最佳实践;考虑改用私有(private)字段和访问器方法。
关于java - 数组的设置方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39335230/