Можно ли ссылаться на разные методы одним вызовом метода в цикле for? - PullRequest
1 голос
/ 01 октября 2019

У меня есть план сделать графический интерфейс настолько минимальным, насколько это возможно. Я попал в кирпичную стену, где я не могу найти ответ или, возможно, какой-то обходной путь, потому что я неопытный в Java.

Я искал совсем немного и нашел только способы заменить последнюю букву или цифру в строке, но не в вызове метода

public static int question;    
public static void main(String[] args) {



int questionNumber = Integer.parseInt(JOptionPane.showInputDialog("Enter project no."));

     if (questionNumber>=7){
         questionNumber=6;
     }
     else if(questionNumber<=3){
         questionNumber=4;
     }
     question = questionNumber;

     System.out.println(question);
     System.out.println(questionNumber);
     for(int i=4; i<=6;i++)
        if(question==i){
          Question4(); // want the number 4 to be the question variable
     }

    }

Что бы я ожидал, это

     for(int i=4; i<=6;i++)
        if(question==i){
          Question *the variable "question" here* (); 
     }

и понятия не имею, возможно ли это или как туда добраться.

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

Вы можете использовать отражение :

try {
    Method m =  MyClass.class.getDeclaredMethod("Question"+questionNum);
    m.invoke(this);
} catch (NoSuchMethodException e) {
    // Handle
}

Но вы должны правильно обработать исключение, потому что оно, скорее всего, потерпит неудачу в тот или иной день.

Вы можететакже используйте enum для определения каждого поведения и вызова соответствующего:

private static enum EnQuestion {
    Question1 {
        public void run(MyClass instance) {
            // ...
        }
    },
    Question2 {
        ...
    },
    ...
    QuestionN {
        ...
    };

    public void run(MyClass instance);
}

Перечисление должно быть статическим, чтобы вы не могли получить доступ к MyClass защищенным / закрытым полям иметоды.

Затем вызовите его:

EnQuestion.values()[numQuestion].run(this);
0 голосов
/ 01 октября 2019

Использование карты в этой ситуации является наиболее простым решением. Вы должны узнать, как их использовать и как они работают, но теперь это больше касается дизайна. Если вы хотите передать некоторые параметры в ваш метод, взгляните на Consumer, BiConsumer или даже класс Function, предоставляемый java. Посмотрите в этом примере, как может выглядеть реализация с Runnable, который не принимает параметров.

        Map<Integer, Runnable> map = new HashMap<>(); // creating Map variable
        // registering questions
        map.put(1, () -> {
            System.out.println("Question #1");
        });
        int questionNumber = 0;// get option id
        if (map.containsKey(questionNumber)) { // first check if question is registered
            map.get(questionNumber).run(); // get runnable that is registered with exact questionNumber and run it
        } else {
            // print invalid question number
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...