【问题标题】:Is it correct to use multiple constructors this way? [duplicate]以这种方式使用多个构造函数是否正确? [复制]
【发布时间】:2017-03-09 09:34:12
【问题描述】:

我不太确定这是如何工作的,但如果我想为类的对象提供更多或更少变量的选项,这是否适用于这样的多个构造函数?

假设我想创建一个多项选择题,但是我不知道我的用户想输入多少个答案,也许是 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 个构造函数? 归根结底,在尝试了这种方法之后,出于某种原因,将其放入哈希映射中,然后将其序列化到文件中在那里。我对问题是什么感到有些困惑,也许这与我的 toString 覆盖有关,但无论如何,请告诉我这个问题,这样我就不必担心一个令人困惑的问题。

【问题讨论】:

  • 你应该查找“构造函数重载”
  • 如果你要重用值,你可以使用 this(args); 从另一个构造函数调用一个构造函数;
  • 我可能弄错了,但不是所有这些多参数混淆,为什么不把所有答案放在 arraylist 或其他东西中......我觉得你的逻辑和方法很奇怪...... .
  • 无需调用super Quiz类隐式扩展对象类
  • “将其放入哈希映射然后将其序列化为文件不起作用” - 请注意“这不起作用”很少有帮助。如果您希望我们提供任何帮助,您应该告诉我们它在哪些方面不起作用、您到底做了什么、您期望什么以及您得到了什么(任何错误、不同的结果等)。

标签: java multiple-constructors


【解决方案1】:

对于您发布的代码,这将是一个简单的方法:

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]等等。

还有一条评论:在构造函数中调用 no-args super() 通常是多余的(您不需要它们)。

【讨论】:

  • 不错的细分,这也是我的建议。不过,我会对构造函数进行一项更改:answers 可能为空,这可能会破坏系统。因此,rightAnswer 应该是可能答案的一部分(然后可以将其改组为不依赖于顺序),或者在可变参数 additionalAnswers 之前应该有一个 firstAnswer 以强制调用者提供至少一个(尽管如果answers 不包含rightAnswer,则后一个选项可能仍会破坏它。 - 不过,这更像是对 OP 的建议。由于关系密切,我只是把它扔在这里;)
  • @Thomas 不错的建议。您可以将if (answers.length == 0) throw IllegalArgumentException("must have at least one answer") 放入构造函数中。
  • 是的,也许改进的方法是一件很不错的事情,但是我实际上正在制作该类的对象并将它们放入哈希图中,这样当您创建问题时,答案就会被加密。这意味着如果您创建一个完整的测验并将该序列化文件提供给学生,他们不能只打开文件以查看答案(所有内容都是加密的),他们必须使用程序打开它,该程序仅在完成后显示测验,或者根本不显示它们,而只显示结果。这是包含在 GUI 中的大量代码的一部分,因此我得到了所有检查以找到最少 2 个答案。
【解决方案2】:

为什么不使用答案列表。

 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;

    }

它看起来有点井井有条。

【讨论】:

  • 确实如此!非常感谢。
【解决方案3】:

创建一个构造函数来捕获所有值,例如,

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;
    }

那么你可以做两件事,

1:创建其他构造函数,并在其中使用上面创建的构造函数。

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

2:为每个like创建单独的静态方法

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

这将有助于提高可读性。

【讨论】:

  • 好的,我想我依赖太多的代码生成:D 呵呵,非常感谢。我可能会考虑使用它。
猜你喜欢
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 2014-09-27
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多