Java命令对象与方法

Java命令对象与方法,java,api-design,garbage,command-pattern,Java,Api Design,Garbage,Command Pattern,我正在考虑一个我刚刚编写的模块的API。我有很多命令,每个命令都有不同的参数、模式等等。例如,我可以在不同的地址模式下应用命令(unaddress、Address、SELECTED,…) 根据这一点,我们可能需要参数中的地址,也可能不需要 我想知道如何将这样的API公开为Java接口。 最后,这些命令触发一些通过以太网连接的硬件 目前,我有两个想法: 命令对象:void doA(CommandA c)其中CommandA将所有参数/模式信息作为字段保存。我现在必须签入doA是否是有效的参数组合

我正在考虑一个我刚刚编写的模块的API。我有很多命令,每个命令都有不同的参数、模式等等。例如,我可以在不同的地址模式下应用命令(
unaddress、Address、SELECTED,…
) 根据这一点,我们可能需要参数中的地址,也可能不需要

我想知道如何将这样的API公开为Java接口。 最后,这些命令触发一些通过以太网连接的硬件

目前,我有两个想法:

  • 命令对象:
    void doA(CommandA c)
    其中
    CommandA
    将所有参数/模式信息作为字段保存。我现在必须签入
    doA
    是否是有效的参数组合
  • 方法重载:对于每个有效参数组合,都有一个方法,例如
    doA_VariantI(int-param1,byte[]param2,byte[]payload,…)
    doA_VariantI(int-param1,byte[]payload,…)

  • 方法重载可能是排除无效参数组合的最安全方法。但我必须为每个命令创建6-7个重载(我希望避免)。好处是所有参数都在堆栈上,而命令对象将创建大量垃圾


    我想知道是否有人可以分享一些关于这方面的经验。垃圾真的是一件值得担心的事情吗?

    “好处是所有参数都在堆栈上,而命令对象将创建大量垃圾。”好的,只有
    int
    s和对
    字节[]
    s的引用才会在堆栈上。
    byte[]
    s本身仍然需要进行垃圾收集。嗯,是的,我忘了提到
    byte[]
    实际上是预先分配的缓冲区。所以
    byte[]payload
    实际上意味着
    byte[]buf,int offset,int length