创建数组以将相同的参数传递给不同的 类

Create array to pass same arguments to different classes

根据 switch 语句的匹配,我的代码调用一个 class 或另一个。每个 class 都采用完全相同的参数组:

switch (propAlarma.asunto[iteracionAlarma]) {
    case "Reinicio Mirth":
        resultado = ReiniciosMirth.main(
            prop,
            propAlarma,
            dt,
            iteracionAlarma,
            propAlarma.json[iteracionAlarma],
            idNotify
        );
        break;
    case "Alerta de actualizacion Mirth":
        resultado = ActualizacionMensajeriaMirth.main(
            prop,
            propAlarma,
            dt,
            iteracionAlarma,
            propAlarma.json[iteracionAlarma],
            idNotify
        );
        break;
    default:
        System.out.println("No hay match en el switch");
}

这些是我传递的对象的 classes。例如:

public static String main(
    Properties prop,
    PropiedadesAlarma PropiedadesAlarma,
    DateTime dt,
    int iteracionAlarma,
    JSONObject mailJson,
    int idNotify
) {

我想对此进行优化,因为我计划向开关添加更多案例。我是 Java 的新人(我习惯在 Python 编程)。在 Python 我会做这样的事情:

arguments = [
    prop,
    propAlarma,
    dt,
    iteracionAlarma,
    propAlarma.json[iteracionAlarma],
    idNotify
]

if propAlarma.asunto[iteracionAlarma] == "Reinicio Mirth":
    ReiniciosMirth.main(arguments)
if propAlarma.asunto[iteracionAlarma] == "Alerta de actualizacion Mirth":
    ActualizacionMensajeriaMirth.main(arguments)

实现此目的的一种方法是为所有这些 classes 创建一个具有 main 方法的通用接口:

public interface OptionForTheSwitchStatement { // please give it a better name
    String main(
        Properties prop,
        PropiedadesAlarma PropiedadesAlarma,
        DateTime dt,
        int iteracionAlarma,
        JSONObject mailJson,
        int idNotify
    );
}

然后,让所有这些 classes 实现 OptionForTheSwitchStatement:

public class ReiniciosMirth implement OptionForTheSwitchStatement {
    public String main(
        Properties prop,
        PropiedadesAlarma PropiedadesAlarma,
        DateTime dt,
        int iteracionAlarma,
        JSONObject mailJson,
        int idNotify
    ) { ... }
}

请注意,如果您实施 OptionForTheSwitchStatementmain 必须是非静态的。如果你不想改变它,那也没关系。见下文。

然后,在你的 switch 语句中,你可以这样做:

OptionForTheSwitchStatement option = switch (propAlarma.asunto[iteracionAlarma]) {
    case "Reinicio Mirth" -> new ReiniciosMirth();
    case "Alerta de actualizacion Mirth" -> new ActualizacionMensajeriaMirth();
    default -> {
        System.out.println("No hay match en el switch");
        yield null;
    }
};

您可以将此视为选择要调用哪个 class' main 方法的开关。

如果您不想将 main 方法更改为非静态方法,您可以使用方法引用代替:

OptionForTheSwitchStatement option = switch (propAlarma.asunto[iteracionAlarma]) {
    case "Reinicio Mirth" -> ReiniciosMirth::main;
    case "Alerta de actualizacion Mirth" -> ActualizacionMensajeriaMirth::main;
    default -> {
        System.out.println("No hay match en el switch");
        yield null;
    }
};

之后,使用参数调用options.main

if (options != null) {
    options.main(
        prop,
        propAlarma,
        dt,
        iteracionAlarma,
        propAlarma.json[iteracionAlarma],
        idNotify
    );
}