在类中创建多个对象

时间:2010-02-12 23:35:10

标签: java java-me

我正在尝试创建一个类。我们称之为问卷调查。在调查问卷中,我想实例化一些名为Question的类。调查问卷的构造函数接受一个字符串数组,对于每个单词,应该有一个Question类来接受它作为其构造函数的参数。换句话说,对于作为参数传递的每个字符串,我想创建一个问题。

我需要能够将调查问卷放在更大的类中,并且仍然可以调用问题类的方法。传递给调查问卷的数组大小也有所不同。当我不知道将会有多少类,以及如何从外部类引用它们时,我不知道如何将多个类放在另一个类中。如果数组是一个固定的长度我只是创建问题为问题1,问题2,问题3 ...但由于事实并非如此,我不再确定。我知道我想要创建的问题类数量最多。

编辑:我正在使用J2ME CDLC 1.1 MIDP 2.0(它是手机应用程序的一部分)所以我的解决方案受到它提供的限制。

5 个答案:

答案 0 :(得分:4)

您不希望每个问题都有一个单独的变量 - 使用List<Question>来创建一个引用问题集合的变量:

public class Questionnaire
{
    private final List<Question> questions;

    public Questionnaire(String[] words)
    {
        questions = new ArrayList<Question>();
        for (String word : words)
        {
            questions.add(new Question(word));
        }
    }

    // Use questions here
}

编辑:如果您所处的环境没有泛型,您可以使用非泛型表单,如下所示:

    private final List questions;

    public Questionnaire(String[] words)
    {
        questions = new ArrayList();
        for (String word : words)
        {
            questions.add(new Question(word));
        }
    }

或者像这样,如果你没有List / ArrayList:

    private final Vector questions;

    public Questionnaire(String[] words)
    {
        questions = new Vector();
        for (String word : words)
        {
            questions.add(new Question(word));
        }
    }

在任何一种情况下,您都需要对每次访问进行强制转换。或者,您可以使用数组:

    private final Question[] questions;

    public Questionnaire(String[] words)
    {
        questions = new Question[words.length];
        for (int i = 0; i < words.length; i++)
        {
            questions[i] = new Question(word);
        }
    }

答案 1 :(得分:1)

由于J2ME API缺少Collections API,您最好的选择是抓住Vector

Vector questions = new Vector();
for (int i = 0; i < words.length; i++) {
    questions.addElement(new Question(words[i]));
}

答案 2 :(得分:0)

import java.util.*;

public class Questionnaire implements Iterable<Question> {
    private final List<Question> questions;

    public Questionnaire(String ...words) {
       questions = new ArrayList<Question>(words.length);
       for(String word : words) {
           questions.add(new Question(word));
       }
    }

    // allows you to use a Questionnaire object in a for-each loop
    public Iterator<Question> iterator() { return questions.iterator(); }

    @Override
    public String toString() { return questions.toString(); }
}

您可以在课程中添加更多好东西,使其更有用。使用上述类的示例如下:

public class QuestionnaireTest {
    public static void main(String[] words) {
        Questionnaire questionnaire = new Questionnaire(words);
        for(Question q : questionnaire) {
            System.out.println("You asked: " + q);
        }
    }
}

你也可以按如下方式使用它:

public class QuestionnaireTest3 {
    public static void main(String[] words) {

        // because I declared the constructor to accept "String ...words", I can specify as many questions as I want using simple syntax
        Questionnaire questionnaire = new Questionnaire("How deep the ocean?", "How high the moon?");
        for(Question q : questionnaire) {
            System.out.println("I asked: " + q);
        }
    }
}

即使我在上面的第一个例子中这样做,你也应该接受一个String对象数组作为问题。这是一个更好的设计:

public class Questionnaire implements Iterable<Question> {
    private List<Question> questions = new ArrayList<Question>();

    public void add(Question q) {
        if(q == null) throw new IllegalArgumentException("can't add null question!");

        questions.add(q);
    }

    public Question get(int index) {
       if(index < 0 || index >= questions.size()) throw new IndexOutOfBoundsException("invalid question index: " + index);

       return questions.get(index);
    }

    // allows you to use a Questionnaire object in a for-each loop
    public Iterator<Question> iterator() { 
        return Collections.unmodifiableList(questions).iterator();
    }

    @Override
    public String toString() { return questions.toString(); }
}

public abstract class Question {
    public String getText();
    public String getAnswer();
    public String getOptions();
    // ...
}

public class YesNoQuestion extends Question {
    private final String text;
    private final String answer;

    public YesNoQuestion(String text, boolean answer) {
       if(!(text.startsWith("Is"))) throw new IllegalArgumentException("Must start with is: " + text);

        this.text = text;

        this.answer = answer ? "Yes" : "No"; // if answer == true, the "Yes",...
    }

     @Override
     public String getText() { return text; }

     public String getAnswer() { return answer; }

     public String getOptions() { return "Yes or No ?"; }
}

现在您可以按如下方式使用它:

public class QuestionnaireTest4 {
    public static void main(String[] words) {

        Questionnaire test = new Questionnaire();

        test.add(new YesNoQuestion("Is dogs animals?", false));
        test.add(new YesNoQuestion("Is me has cheezburgers?", true));

        for(Question q : questionnaire) {

            System.out.println(q);
            System.out.println(q.getOptions());

            String input = null; // you need to code this part
            if(q.getAnswer().equals(input))
                System.out.println("CORRECT!");
            else
                System.out.println("YOU IS STUPID!!!!");
        }
    }
}

答案 3 :(得分:0)

您可能希望使用Set个问题,而不是List。试试:

private final Set<Question> questions;

这可以防止重复的问题。其他所有内容都与JonSkeet的答案相同。

答案 4 :(得分:-1)

为什么不在问卷上使用列表,例如,您添加的每个问题都会在列表中添加一个。

public class Questionnaire
{
    public List<Question> myQuestions {get; private set;}

    public Questionnaire(string[] questions)
    {

       myQuestions = new List<Questions>();

       foreach(string q in questions)
       {
          myQuestions.Add(new Question {questionText = g});
       }
    }
}
public class Question
{
    public string questionText {get; set;}
}

然后你就可以从外面检查问题......这就是你想要的吗?

希望这有帮助

编辑:哦,是Java,但你明白了吗?