类构造函数中大量参数的优雅替代方案

Tim*_*eus 5 java constructor arguments

例如,我有一个构建GUI的类,一个处理GUI所有事件的类,以及包含受GUI对象(主要是滑块)影响的所有对象的主类,以及GUI类和事件类.

现在,事件类的构造函数具有GUI类和GUI所更改的每个对象作为参数.这些都是相当多的对象,所以我现在拥有的论据数量大约是8,而且还在增长.

对我的问题有一个更优雅的解决方案,30个参数根本感觉不对吗?

ps,我宁愿不合并类,因为这三个都很大,并且会使一切都变得不那么可读.

Ben*_*igt 12

通常,在这种情况下使用具有流利语法的构建器对象.你改变了:

new XYZEvent(a, null, null, b, null, c, d, null, null)
Run Code Online (Sandbox Code Playgroud)

new XYZEventBuilder().setA(a).setB(b).setC(c).setD(d).build()
Run Code Online (Sandbox Code Playgroud)

  • @Dasdasd:构建器对象和@Alp后来的答案之间的唯一区别是对象是如何最终构造的.在我的,最后一行将是`GUI myGUI = guiConfig.build();`.流畅的语法是使用构建器类的一个单独问题,@ Alp的配置对象也将从使用它中受益. (2认同)

Alp*_*Alp 5

您可以创建一个配置类来保存所有参数的默认值:

public class GUIConfig {

  private String name = "default";
  // more private declarations

  public GUIConfig() {
    // constructor, just for setting defaults
  }

  // getters and setters

}
Run Code Online (Sandbox Code Playgroud)

现在您可以像这样简单地创建 GUI 类实例:

GUIConfig guiConfig = new GUIConfig();
guiConfig.setName("foo");
// more setters
GUI myGUI = new GUI(guiConfig);
Run Code Online (Sandbox Code Playgroud)

或者仅使用默认值:

GUI myGUI = new GUI(new GUIConfig());
Run Code Online (Sandbox Code Playgroud)