2014-10-27 59 views
1

所以這是一個相當複雜的問題,但對我來說,我將試着解釋盡我所能 -對象/實例問題?

我有一個名爲調查與類:

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

名單是我存儲所有屬於調查的問題。 我想重複這個列表並顯示這些問題。

這是棘手的部分。我有一個使用調查的實例來調用它的菜單方法主要類,並在當前的問題是被添加到ArrayList的一個問題類的調查的實例。

當我打印出來:

survey.questions.size() 

在我問題類,添加一個問題後,我得到 「1」。

但是,當我打印出我的Survey類中的尺寸時,我得到了「0」。

我相信這個問題是因爲主要使用調查的一個單獨的實例來遍歷比在我加入的問題,在我的問題類實例的問題列表。

我會嘗試清除任何混淆!


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 

回答

4

你有一個以上的調查實例,一箇中添加了一個問題,而在主其他沒有問題。而已。

解決方案:只使用Survey的一個實例,並根據需要將其傳遞到需要的地方,但不要創建新實例並期望它與其他實例保持相同的狀態,因爲這不是Java的工作原理。請注意,問題肯定應該是而不是創建Survey的實例。它可以將自身添加到現有的實例中,但它從頭創建實例是沒有意義的。


編輯
幽州的評論:

這是我的想法!我非常業餘,我試圖堅持良好的設計。 survey.displayQuestions()survey.questions.add(this)都需要調查對象來調用這些方法,但我將它們分爲不同的類。我不確定如何只使用一個。

我個人的傾向是有問題的類是無知的調查,換句話說,它不應該持有的調查實例,也沒有調用它的任何方法,因爲它真的不需要了解調查,而你在編碼OOP程序中的目標是儘量減少連接。相反,無論創建問題實例的類是否有將問題放置到Survey對象中。

+0

這就是我的想法!我非常業餘,我試圖堅持良好的設計。 'survey.displayQuestions()'和'survey.questions.add(this)'都需要調查對象來調用這些方法,但是我將它們放在不同的類中。我不確定如何只使用一個。 – Brejuro 2014-10-27 02:37:17

+0

@Brejuro:請參閱編輯。 – 2014-10-27 02:40:52

+0

非常感謝,非常感謝!我會試着找到一種方法來做你說的,再次感謝:) – Brejuro 2014-10-27 02:43:20

0

您可能想要創建一個返回靜態問題實例的新類。這樣,主類和問題類都可以請求靜態列表的副本。

在新類中,檢查實例是否爲空,如果爲空,則新建靜態實例並返回它。根據應用程序的複雜性,您可能需要考慮添加鎖定以避免威脅安全問題。

+0

對不起,但我必須對此答案進行倒票。我們希望推薦的最後一件事是OP在沒有需要時創建靜態實例。如果線程安全是一個問題(我們完全沒有跡象表明這一點),那麼解決這個問題的方法比用洗澡水把孩子扔出去要好得多。 – 2014-10-27 02:48:00

+0

他已經創建了一個靜態實例,並且如果他需要它在主類和問題類之間漫遊,似乎完全合理的將它作爲靜態列表存儲起來。當然,我們對應用程序做出的決定還不夠了解。 – CubeRoot 2014-10-27 02:51:40