Можно ли вызывать методы по имени? - PullRequest
0 голосов
/ 25 февраля 2019

Я создаю небольшое приложение для викторины и храню каждый ответ на каждый вопрос в таблице базы данных (с использованием JPA).

Интересно, есть ли способ, например, динамически извлекать геттеры через цикл for (как это возможно в javascript), а не записывать каждый метод get.

код, который у меня есть (где «answer» - это класс с 9 различными целыми числами для каждого ответа).

public void parseUserScore(UserAnswers answer) {
    Integer[] answers = new Integer[] {
            answer.getQ1(),
            answer.getQ2(),
            answer.getQ3(),
            answer.getQ4(),
            answer.getQ5(),
            answer.getQ6(),
            answer.getQ7(),
            answer.getQ8(),
            answer.getQ9()
    };
    double totalscore = 0;
    Integer answeredQuestions = 0;
    for (int i = 0; i < answers.length; i++) {
        if (answers[i] > 0) {
            answeredQuestions++;
        }
        totalscore += answers[i];
    }
}

Мой вопрос заключается в том, можно ли получить эти ответы через цикл foor следующим образом:

public void parseUserScore(UserAnswers answer) {
    ArrayList<Integer> list = new ArrayList<Integer>();
    for (int i = 1; i < 10; i++) {
        String methodname = "getQ" + i.toString();
        list.add(i, answer.methodname)
    }   
}

Это было бы предпочтительнее, поскольку я хотел бы использовать индекс каждого вопроса для разделения их на основе их соответствующих категорий.

1 Ответ

0 голосов
/ 25 февраля 2019

Из того, что вы указали в своем вопросе, я думаю, вам следует использовать три объекта: User, Question и Answer.Пользователь может задать несколько вопросов и отправить несколько ответов на вопросы.Ответ всегда принадлежит одному вопросу.JPA имеет несколько аннотаций для моделирования этих правил:

@Entity
class User {

    @OneToMany(mappedBy = "user")
    Set<Question> questions;

    @OneToMany(mappedBy = "user")
    Set<Answer> answers;

    // Getters & setters

}

@Entity
class Question {

    @ManyToOne
    @JoinColumn(name = "user_id")
    User user;

    @OneToMany(mappedBy = "question")
    Set<Answer> answers;

    // Getters & setters

}

@Entity
class Answer {

    @ManyToOne
    @JoinColumn(name = "user_id")
    User user;

    @ManyToOne
    @JoinColumn(name = "question_id")
    Question question;

    int score;

    // Getters & setters

}

После этого вы можете просто перебирать ответы конкретного пользователя и вычислять общий балл:

final int totalScore = user.getAnswers().stream().mapToInt(Answer::getScore).sum();

Обратите внимание, что этотолько базовый пример.Вы также должны учитывать вопросы каскадного обновления и выборки типов отношений.

Относительно вашего вопроса о цикле for: Java предоставляет функцию под названием «Отражение».Это механизм метапрограммирования, и его можно использовать для достижения того, что вы описали.Однако это плохая идея, поскольку она имеет некоторые недостатки и не имеет смысла в вашем случае, поскольку пользователь должен иметь возможность ответить более чем на 10 вопросов.На самом деле вы не можете знать, сколько ответов отправит пользователь.

...