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

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

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

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

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

您可以创建一个包含所有参数的默认值的配置类:

public class GUIConfig { private String name = "default"; // more private declarations public GUIConfig() { // constructor, just for setting defaults } // getters and setters } 

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

 GUIConfig guiConfig = new GUIConfig(); guiConfig.setName("foo"); // more setters GUI myGUI = new GUI(guiConfig); 

或仅用于默认值:

 GUI myGUI = new GUI(new GUIConfig()); 

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

 new XYZEvent(a, null, null, b, null, c, d, null, null) 

 new XYZEventBuilder().setA(a).setB(b).setC(c).setD(d).build() 

使用DTO( 数据传输对象 )来保存所有类。 然后可以在单个参数中传递。

除了存储和检索自己的数据之外,DTO没有任何行为

您应该考虑使用Google的AutoValue库: https : //github.com/google/auto/blob/master/value/userguide/index.md

 @AutoValue public abstract class Card { @Nullable public abstract Integer localId(); public abstract Long utcStart(); public abstract Integer paramA(); public abstract Integer paramB(); @Nullable public abstract Boolean paramC(); public static Builder builder() { return new AutoValue_Card.Builder(); } @AutoValue.Builder public abstract static class Builder { public abstract Builder setLocalId(final Integer localId); public abstract Builder setUtcStart(final Long utcStart); public abstract Builder setParamA(final Integer paramA); public abstract Builder setParamB(final Integer paramB); public abstract Builder setParamC(final Boolean paramC); public abstract Card build(); } } 

所有非必填字段都可以使用@Nullable进行注释。

要创建一个不可变的Card对象,您只需使用:

 Card myCard = Card.builder() .setLocalId(123456) // this line can be omitted .setUtcStart(158632478000) .setParamA(5) .setParamB(58) .setParamC(true) // this line can be omitted .build(); 

“AutoValue是一个很好的工具,可以消除在Java中编写普通值类的苦差事。它将大部分建议都封装在Effective Java第2章中,让你可以专注于程序中更有趣的方面。由此产生的程序很可能更短,更清晰,更自由。两个竖起大拇指。“

– Joshua Bloch,作者,Effective Java