【问题标题】:Object/Instance issue?对象/实例问题?
【发布时间】:2014-12-22 04:55:52
【问题描述】:

所以这对我来说是一个相当复杂的问题,但我会尽力解释 -

我有一个名为 Survey 的课程,其中包含:

ArrayList<Question> questions = new ArrayList<Question>();

该列表是我存储属于调查的所有问题的地方。 我正在尝试遍历此列表并显示这些问题。

这是棘手的部分。我有一个 Main 类,它使用 Survey 的实例来调用它的菜单方法,并在 QuestionSurvey 的实例/strong> 将当前问题添加到 ArrayList 的类。

当我打印出来时:

survey.questions.size()

在我的 Questions 课程中,添加一个问题后,我得到“1”。

但是,当我在 Survey 课程中打印出尺寸时,我得到了“0”。

我认为问题是因为 Main 使用单独的 Survey 实例来迭代问题列表,而不是我在 Question 中添加问题的实例强>类。

我会尽力消除任何困惑!


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

【问题讨论】:

    标签: java oop object instance instances


    【解决方案1】:

    您有多个调查实例,其中一个添加了一个问题,而另一个在 main 中没有问题。而已。

    解决方案:仅使用一个 Survey 实例,并在需要时将其传递到需要它的位置,但不要创建新实例并期望它保持与其他实例相同的状态,因为 Java 不是这样工作的。请注意,问题绝对应该创建一个调查实例。它可以将自己添加到现有实例中,但从头创建实例是没有意义的。


    编辑
    您在评论中声明:

    这就是我的想法!我很业余,我试图坚持好的设计。 survey.displayQuestions()survey.questions.add(this) 都需要调查对象来调用这些方法,但我将它们放在单独的类中。我不确定如何只使用一个。

    我自己的倾向是让 Question 类对调查一无所知,换句话说,它不应该持有一个调查实例,也不应该调用它的任何方法,因为它真的不需要了解调查和你的目标在编码 OOP 程序中是最小化连接。相反,任何创建 Question 实例的类都将 Question 放入 Survey 对象中。

    【讨论】:

    • 这就是我的想法!我很业余,我试图坚持好的设计。 survey.displayQuestions()survey.questions.add(this) 都需要调查对象来调用这些方法,但我将它们放在单独的类中。我不确定如何只使用一个。
    • 非常感谢,非常感谢!我会尝试找到一种方法来做你所说的,再次感谢:)
    【解决方案2】:

    您可能希望创建一个返回静态问题实例的新类。这样主类和问题类都可以请求静态列表的副本。

    在新类中,检查实例是否为空,如果为空,则新建静态实例,然后返回它。根据应用程序的复杂性,您可能需要考虑添加锁定以避免威胁安全问题。

    【讨论】:

    • 对不起,但我必须否决这个答案。我们要推荐的最后一件事是让 OP 在不需要静态实例时创建静态实例。如果线程安全是一个问题(我们绝对没有迹象表明这一点),那么解决这个问题的方法比把婴儿和洗澡水一起扔出去要好得多。
    • 他已经在创建一个静态实例,如果他需要它在主类和问题类之间徘徊,将它作为静态列表存储似乎是完全合理的。当然,我们对应用程序的了解还不够,无法做出该决定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 1970-01-01
    • 2014-04-06
    相关资源
    最近更新 更多