java - 是否可以在 for 循环中使用一个方法调用来引用不同的方法?

标签 java dynamic-programming

我有一个计划,让 GUI 尽可能最小化。由于我在 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* (); 
     }

并且不知道这是否可能或如何到达那里。

最佳答案

Is it possible to reference different methods with one method call in a for loop?

是的。这取决于您所说的不同方法的具体含义。以下是实现这一目标的三种常用方法:

  • Java 枚举工具允许开发人员定义特定于常量的方法,这些方法是在每个单独的枚举常量声明中定义的不同方法体。调用的实际方法主体取决于进行方法调用的实际枚举常量(这实际上是下一个项目符号项的特化)。

  • 接口(interface)允许在每个单独的实现中定义不同的方法体。这样,调用的实际方法体取决于进行方法调用的实际实现的实例。

  • 使用“相同方法调用”调用不同方法体的另一种方法是使用 Java 的反射工具执行方法调用。由于 Java 是一个面向对象的开发环境,因此应谨慎做出使用反射的决定。与不使用反射的解决方案相比,反射(通常)速度较慢、可读性较差且笨拙。反射还使得许多可以在编译时检测到的错误只能在运行时检测到。

在 Java 中,抽象的主要机制是类和接口(interface),因此,当考虑问题域并将其解析为对象域时,您应该考虑如何设计提供最自然描述的接口(interface)和类.

您希望能够调用与特定问题相对应的方法。解决这个问题的更好方法不是通过对问题的方法调用来抽象它,而是抽象问题本身。您的项目有问题,因此这是一个很好的线索,您应该有一个 Question 类。

这里是一个利用 Java 枚举工具(枚举是一种特殊类型)的问题的骨架解决方案。这个解决方案与Matthieu建议的类似,但根本不需要反射(reflection);相反,它使用上面的第一个项目符号项并定义特定于常量的方法(它本身就是上面第二个项目符号项的特化):

public enum Question {
    QUESTION_1 {
        @Override public String getText() {
            return "This is the text for Question #1.";
        }
    },

    QUESTION_2 {
        @Override public String getText() {
            return "This is the text for Question #2.";
        }
    },
    :
    :

    QUESTION_N {
        @Override public String getText() {
            return "This is the text for the final question in the series.";
        }
    };

    public abstract String getText();
}

此枚举类为一系列问题中的每个问题定义一个常量(每个常量声明在运行时都成为枚举类 Question 的实例)。每个声明都为方法 getText() 定义了不同的方法主体,该方法主体在每个枚举常量内被覆盖。

枚举末尾的声明 public abstract... 通知编译器每个枚举常量必须提供 getText() 方法的实现。如果开发人员向该系列添加了一个新问题,但忘记在其中添加 getText() 方法,编译器会提示(这是一种可以在编译时使用以下方法捕获的错误)基于对象的解决方案,如果使用反射,则只能在运行时捕获)。

这是一个简单的程序来练习您的 Question 枚举类。它只是打印出每个问题常量的名称,后跟其问题文本:

public static void main(String[] args) {
    for (Question question : Question.values()) { // here is the "one for loop"
        String text = question.getText();         // here is the "one method call"
        println(question.toString());
        println(text);
    }
}

不使用反射。相反,Java 类型系统的自然抽象机制能够实现为每个问题调用单独的方法体的预期目标。

关于java - 是否可以在 for 循环中使用一个方法调用来引用不同的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58189810/

相关文章:

java - 与数据报套接字相比,使用数据报 channel 有什么优势

c++ - 爬楼梯动态规划的最小成本

algorithm - 这个问题可以使用背包问题解决方法来解决吗(不同大小的背包?)

javascript制作更改算法

java - 创建4+1架构模型

Java的hashSet处理具有相同哈希码的多个项目

java - 是否可以为特定枚举设置构造函数?

java - 将特定的 Json 键值插入从 Oracle DB 中提取的 Json 主体中

algorithm - 在 k 次尝试中满足最大客人数(时间间隔)

algorithm - 动态规划 : Why Knuth's improvement to Optimal Binary Search Tree O(n^2)?