2017-03-09 32 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非常感谢你。我可能会考虑使用它。 –

相关问题