【问题标题】:setter methods for arrays数组的setter方法
【发布时间】:2017-01-13 02:21:21
【问题描述】:

我有一个复习课,用于在另一个名为游戏信息的课中创建一个数组。

我创建了一个 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;
            }
        }
    }
}

【问题讨论】:

  • T.J. 的回答说明了为什么这段代码会出现异常。但我也质疑这是否真的是你想做的事情。为了使您的解决方案有效,构造GameInfo 的代码还必须构建一个null 插槽数组,然后再添加,或者可能是一个包含一些评论和一堆其他null 插槽的数组。这似乎是一种 C 的做事方式。请查看ArrayList,这是一种允许动态向数组添加元素的更好方法。

标签: java arrays class oop


【解决方案1】:

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

不,两个问题:

  1. 您让它寻找null,但随后尝试分配给null 上的字段:

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

    ...这将引发 NPE,因为您试图在 null 上设置属性 reviewText 的值。您需要创建一个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. addReview 如果阵列已满,则会静默失败。您会想要大声失败:-) 或者创建一个更大的新数组,将旧数组复制到其中,然后添加到末尾。

    数组在这里可能不是理想的选择,您可能希望使用List&lt;Review&gt; 代替(您可以使用ArrayList&lt;Review&gt;LinkedList&lt;Review&gt; 进行初始化,任何适合的)。它会简单得多。但我不知道设计限制。


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

【讨论】:

  • sigh如果你在上面看到this.reviews[i].reviewText = new Review,点击刷新。
  • “您的评论是不可变的”不,不是,这些字段是公开的
  • @NicolasFilotto:天哪,我完全错过了那些 public 修饰符!哎呀。
  • 要完整说明为什么它不起作用,您还应该介绍当数组已满时会发生什么,即“添加”将被默默地忽略!我>
  • 额外奖励请采纳@ajb's comment,建议使用ArrayList
猜你喜欢
  • 1970-01-01
  • 2019-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-23
  • 2012-01-08
  • 2011-07-09
  • 2013-04-16
相关资源
最近更新 更多