【问题标题】:Create array to pass same arguments to different classes创建数组以将相同的参数传递给不同的类
【发布时间】:2021-07-10 08:16:22
【问题描述】:

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

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");
}

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

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)

【问题讨论】:

  • 如果您是 Java 新手,也许您应该了解所谓的接口和依赖项注入...尤其是如果您的所有类都接受相同数量(和类型)的参数

标签: java arrays class switch-statement arguments


【解决方案1】:

一种方法是为所有这些具有main 方法的类创建一个通用接口:

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

然后,让所有这些类都实现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;
    }
};

您可以将其视为选择调用哪个类的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
    );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-26
    • 2015-05-07
    • 2017-05-10
    • 2013-01-30
    相关资源
    最近更新 更多