如何在Java测验应用的构造方法中传入选项对象数组?
解决方案
1. 重构Question类,用选项数组替代单个选项变量
把原来的opt1-opt4四个独立成员变量替换为String[] options数组,同时修改构造方法接收数组参数,建议加入参数校验确保选项数量符合要求:
package com.param; import java.util.Arrays; public class Question { private int id; private String question; private String[] options; // 替换单个选项变量为数组 private String answer; // 修改构造方法,接收选项数组参数 public Question(int id, String question, String[] options, String answer) { super(); // 校验选项数组合法性,避免传入空数组或长度不符的情况 if (options == null || options.length != 4) { throw new IllegalArgumentException("必须传入包含4个选项的数组"); } this.id = id; this.question = question; this.options = Arrays.copyOf(options, options.length); // 拷贝数组防止外部篡改内部状态 this.answer = answer; } // 调整getter/setter方法 public int getId() { return id; } public void setId(int id) { this.id = id; } public String getQuestion() { return question; } public void setQuestion(String question) { this.question = question; } // 返回选项数组的拷贝,避免外部修改内部数据 public String[] getOptions() { return Arrays.copyOf(options, options.length); } // 设置选项数组时同样校验长度 public void setOptions(String[] options) { if (options == null || options.length != 4) { throw new IllegalArgumentException("必须传入包含4个选项的数组"); } this.options = Arrays.copyOf(options, options.length); } // 可选:保留原有单个选项的获取方法,兼容旧代码调用逻辑 public String getOpt1() { return options[0]; } public String getOpt2() { return options[1]; } public String getOpt3() { return options[2]; } public String getOpt4() { return options[3]; } public String getAnswer() { return answer; } public void setAnswer(String answer) { this.answer = answer; } @Override public String toString() { return "Question [id=" + id + ", question=" + question + ", options=" + Arrays.toString(options) + ", answer=" + answer + "]"; } }
2. 修改QuestionService类,传入选项数组创建Question对象
在实例化Question时,直接传入String[]类型的选项数组替代原来的单个选项参数:
package com.param; public class QuestionService { Question[] questions = new Question[4]; public QuestionService() { // 用数组形式传入选项参数 questions[0] = new Question(1, "Value of pie", new String[]{"3.12", "3.01", "3.14", "3.11"}, "3.14"); questions[1] = new Question(2, "Your age", new String[]{"24", "54", "35", "25"}, "25"); questions[2] = new Question(3, "This year", new String[]{"1898", "2034", "2024", "1999"}, "2024"); questions[3] = new Question(4, "Days in jan", new String[]{"31", "30", "34", "11"}, "31"); } public void playQuiz() { System.out.println("The quiz begins"); for(Question q: questions) { System.out.println(q.getId() + "." + q.getQuestion()+"\n"); // 遍历选项数组打印,无需逐个调用getOpt1-4 String[] options = q.getOptions(); for(String opt : options) { System.out.println(opt + "\n"); } } } }
关键说明
- 数组拷贝:构造方法和setter中使用
Arrays.copyOf,避免外部修改传入的数组影响Question内部状态。 - 参数校验:加入数组长度校验,提前拦截非法参数,避免后续逻辑出错。
- 兼容性:保留了原有的
getOpt1()等方法,若原有代码依赖这些方法可直接复用;不需要兼容时可删除这些方法。
内容的提问来源于stack exchange,提问作者Paramesh Athreya
相关产品推荐
相关产品推荐

