2017-03-09 45 views
-1

我不太確定這是如何工作的,但是如果我想給出更多或更少的變量給一個類的對象的選項,這會使用這樣的多個構造函數嗎?以這種方式使用多個構造函數是否正確?

比方說,我想創建一個選擇題問卷,但我不知道有多少回答我的用戶想輸入,2,3,4,5,6也許?所以對於那個:

public class Quiz { 
    private int counter; 
    private String question; 
    private String answer1; 
    private String answer2; 
    private String answer3; 
    private String answer4; 
    private String answer5; 
    private String answer6; 
    private String rightAnswer; 

    public Quiz(int counter,String question, String answer1, String answer2, String rightAnswer){ 
     super(); 
     this.counter = counter; 
     this.question = question; 
     this.answer1 = answer1; 
     this.answer2 = answer2; 
     this.rightAnswer = rightAnswer; 
    } 
    public Quiz(int counter, String question, String answer1, String answer2, String answer3, String rightAnswer) { 
     super(); 
     this.counter = counter; 
     this.question = question; 
     this.answer1 = answer1; 
     this.answer2 = answer2; 
     this.answer3 = answer3; 
     this.rightAnswer = rightAnswer; 
    } 
    public Quiz(int counter, String question, String answer1, String answer2, String answer3, String answer4, 
       String rightAnswer) { 
     super(); 
     this.counter = counter; 
     this.question = question; 
     this.answer1 = answer1; 
     this.answer2 = answer2; 
     this.answer3 = answer3; 
     this.answer4 = answer4; 
     this.rightAnswer = rightAnswer; 
    } 
    //...more options 

也許我可以只做1構造函數與某種枚舉或開關? 在一天結束的時候,嘗試這種方法,因爲某些原因把這個變成一個HashMap,然後將其序列化到一個文件後不起作用,其中與1個構造它的工作原理,但在那裏不寫的一切。我對這個問題有些困惑,也許這跟我的toString覆蓋有關,但無論如何,只要告訴我這個問題,這樣我就可以減少一個令人困惑的問題。

+4

你應該查找「構造函數重載」 – QBrute

+0

如果你是要去回用價值,你可以從另一個使用此(參數)調用一個構造函數; –

+0

我可能會得到這個錯誤,但不是所有這種多重參數混淆,爲什麼不把所有的答案都放在數組列表中呢?我覺得你的邏輯和方法很奇怪。 – Marko

回答

2

爲您發佈的代碼,這將是一個簡單的方法:

package com.steve.research; 

public class Quiz { 

    private int counter; 
    private String question; 
    private String answer1; 
    private String answer2; 
    private String answer3; 
    private String answer4; 
    private String answer5; 
    private String answer6; 
    private String rightAnswer; 

    public Quiz(int counter, String question, String answer1, String answer2, String rightAnswer) { 
     this(counter, question, answer1, answer2, null, null, rightAnswer); 
    } 

    public Quiz(int counter, String question, String answer1, String answer2, String answer3, String rightAnswer) { 
     this(counter, question, answer1, answer2, answer3, null, rightAnswer); 
    } 

    public Quiz(int counter, String question, String answer1, String answer2, String answer3, String answer4, String rightAnswer) { 
     this.counter = counter; 
     this.question = question; 
     this.answer1 = answer1; 
     this.answer2 = answer2; 
     this.answer3 = answer3; 
     this.answer4 = answer4; 
     this.rightAnswer = rightAnswer; 
    } 
} 

一種改進的方法,我建議你看一下「可變參數」的問題。由於問題數量可變,因此可以將String ... questions作爲最後一個構造函數參數(因此rightAnswer必須先前)。

public class Quiz { 

    private int counter; 
    private String question; 
    private String rightAnswer; 
    private String[] answers; 

    public Quiz(int counter, String question, String rightAnswer, String... answers) { 
     this.counter = counter; 
     this.question = question; 
     this.rightAnswer = rightAnswer; 
     this.answers = answers; 
    } 

    public static void main(String[] args) { 
     new Quiz(1, "one plus one", "two", "one", "two", "three"); 
     new Quiz(1, "one plus one", "two", "one", "two", "three", "four"); 
     new Quiz(1, "one plus one", "two", "one", "two", "three", "four", "five"); 
    } 
} 

注意answers現在是一個字符串數組String[],你可以參考answers.lengthanswers[0]等。

還有一個註釋:調用無參數super()在構造函數通常是多餘的(你不需要它們)。

+0

不錯的細分,這也是我的建議。不過,我會對構造函數進行一次更改:「answers」可能是空的,這可能會破壞系統。因此,'rightAnswer'應該是可能的答案的一部分(然後可以被洗牌而不依賴於順序),或者在可變參數'additionalAnswers'之前應該有'firstAnswer'以強制主叫方提供至少一個(儘管如果'answers'不包含'rightAnswer'),後面的選項仍然可以打破它。 - 但這更多的是對OP的建議。我只是傾倒它在這裏,因爲密切的關係;) – Thomas

+0

@Thomas很好的建議。你可以把'if(answers.length == 0)在構造函數中拋出IllegalArgumentException(「必須至少有一個答案」)''。 – vikingsteve

+0

是的,也許改進的方法是一件很好的事情,但是我實際上是把這個類的對象放到一個hashmap中,這樣當你創建一個問題時,答案就會被加密。這意味着如果您創建了一個測驗並將該序列化文件提供給學生,他們不能僅僅打開該文件來查看答案(所有內容都已加密),必須使用該程序打開該程序,該程序僅在完成後才顯示測驗,或根本不顯示,但只有結果。這是包含在GUI中的大量代碼的一部分,所以我得到了最低2個答案的所有檢查。 –

0

爲什麼不使用答案列表。

public int Quiz(int counter, List<String> answers, String rightAnswer){...} 

也可以使用替代構造像

public Quiz(int counter,String question, String answer1, String answer2, String rightAnswer){ 
    super(); 
    this.counter = counter; 
    this.question = question; 
    this.answer1 = answer1; 
    this.answer2 = answer2; 
    this.rightAnswer = rightAnswer; 
    } 

public Quiz(int counter,String question, String answer1, String answer2, String answer3,String rightAnswer){ 
    this(counter,answer1,answer2,rightAnswer); 
    this.answer3 = answer3; 

    } 

它看起來有點舉辦。

+0

它確實!非常感謝。 –

0

創建一個構造函數來捕獲所有的價值觀一樣,

public Quiz(int counter,String question, String answer1, String answer2, String answer3,String rightAnswer){ 
    super(); 
    this.counter = counter; 
    this.question = question; 
    this.answer1 = answer1; 
    this.answer2 = answer2; 
    this.answer3 = answer3; 
    this.rightAnswer = rightAnswer; 
    } 

那麼你可以做2件事,

1:創建其他的構造和內部那些使用上面創建這樣的構造。

public Quiz(int counter,String question, String answer1, String answer2,String rightAnswer){ 
this(counter,question, answer1, answer2, null, rightAnswer) 
} 

2:爲每個單獨的靜態方法,如

public Quiz getQuizeWithTwoAnswers(int counter,String question, String answer1, String answer2,String rightAnswer){ 
    return new Quiz(counter,question, answer1, answer2, null, rightAnswer)} 

,這將有助於提高可讀性。

+0

好吧,我想我依賴的代碼太多了:D hehehe非常感謝你。我可能會考慮使用它。 –

相關問題