java - 数组的设置方法

标签 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;
            }
        }
    }
}

最佳答案

I just want to be sure that I have the logic correct for the addReview method.

不,有两个问题:

  1. 您正在寻找 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;
    }
    
  2. addReview如果数组已满,则只是默默地失败。您可能想要大声失败 :-) 或创建一个更大的新数组,将旧数组复制到它上面,然后添加到末尾。

    这里数组可能不是理想的选择,你可能想看看使用 List<Review>相反(您可以使用 ArrayList<Review>LinkedList<Review> 进行初始化,无论适合什么)。这会简单得多。但我不知道设计约束。


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

关于java - 数组的设置方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39335230/

相关文章:

java - 使 JPanel 图像从 actionPerformed() 事件发生变化

java - 从用户方法读取整数

java - 为什么父类(super class) B 调用子类 A 的方法?

arrays - 编写一次并行数组 Haskell 表达式,在 CPU 和 GPU 上运行 repa 并加速

javascript - 制作对象数组时的封装问题

c++ - 调用 operator<< 时出现链接器错误,如何解决?

python - 将属性添加到类列表以返回具有特定属性的所有对象

java - 如何在日期解析(Java)中忽略时区标识符?

php - swift 3.0 中的播放器 ID 格式问题

java - 为什么对接口(interface)的引用数组可以容纳实现该接口(interface)的类?