所以这对我来说是一个相当复杂的问题,但我会尽力解释 -
我有一个名为调查的课程,其中包含:
ArrayList<Question> questions = new ArrayList<Question>();
列表是我存储属于调查的所有问题的地方。 我试图迭代这个列表并显示这些问题。
这是棘手的部分。我有一个 Main 类,它使用调查的实例来调用它的菜单方法,并在问题<中使用调查的实例/ strong>将当前问题添加到ArrayList的类。
当我打印出来时:
survey.questions.size()
在我的问题课程中,添加一个问题后,我得到“1”。
但是,当我在调查课程中打印出尺寸时,我得到了“0”。
我认为问题是因为在我的问题中,Main正在使用调查的单独实例来迭代问题列表而不是我添加问题的实例上课。
我会尽力清除任何混乱!
public class Survey {
public ArrayList<Question> questions = new ArrayList<Question>();
// Iterate over questions List
public void displayQuestions() {
int numberCount = 1;
int optionCount = 1;
System.out.println(questions.size()); // PRINTS 0
for (int i = 0; i < questions.size(); i++) {
System.out.print("Question" + numberCount + ") ");
System.out.println(questions.get(i).prompt);
for(int j = 0; j < questions.get(i).options.size(); j++) {
System.out.print(optionCount + ". ");
System.out.println(questions.get(i).options.get(j));
}
}
}
public class Main {
private static Survey survey = new Survey();
// After selecting "Display Survey" menu option
survey.displayQuestions();
public class Question {
protected Survey survey = new Survey();
// After finishing making the question
survey.questions.add(this);
System.out.println(survey.questions.size()); // PRINTS 1
答案 0 :(得分:4)
您有多个Survey实例,其中一个添加了一个问题,而另一个则没有问题。而已。
解决方案:仅使用一个Survey实例,并在需要时将其传递到需要的位置,但不要创建新实例并期望它与其他实例保持相同的状态,因为这不是Java的工作方式。请注意,问题应该绝对不创建一个Survey实例。它可以将自己添加到现有实例中,但是从头创建实例是没有意义的。
修改强>
您在评论中说明:
这就是我的想法!我非常业余,我试图坚持好的设计。
survey.displayQuestions()
和survey.questions.add(this)
都需要调查对象来调用这些方法,但我将它们放在不同的类中。我不确定如何只使用一个。
我自己的倾向是让问题类对调查一无所知,换句话说,它不应该持有调查实例,也不应该调用任何方法,因为它实际上不需要了解调查和你的目标编码OOP程序是为了最小化连接。相反,无论创建Question实例的类,都要 将Question放入Survey对象。
答案 1 :(得分:0)
您可能想要创建一个返回静态问题实例的新类。这样主要和问题类都可以请求静态列表的副本。
在新类中,检查实例是否为null,如果为null,则新建静态实例,然后返回它。根据应用程序的复杂程度,您可能需要考虑添加锁定以避免威胁安全问题。