【问题标题】:How best to make readable excessive constructor parameters如何最好地使可读的过多构造函数参数
【发布时间】:2023-04-03 19:38:02
【问题描述】:

我正在为我正在开发的模拟器游戏制作一个 manaCount 对象。

构造函数如下:

public ManaCount(int red, int white, int blue, int green, int black, int colorless){
    redManaCount = red;
    whiteManaCount = white;
    blueManaCount = blue;
    greenManaCount = green;
    blackManaCount = black;
    colorlessManaCount = colorless;
}

我看不出有什么办法可以在构造函数中使用这么多参数,但我希望有一种方法可以使 manaCount 对象的实例化比以下内容更具描述性:

ManaCount test = new ManaCount(0,0,0,0,0,0);

目前看来,如果没有看到实现,就不可能知道哪个颜色进入哪个参数。是否有任何形式的 Java 魔法可以做到这一点?

【问题讨论】:

标签: java readability


【解决方案1】:

我建议你使用 Lombok。这就是您使用@Builder 的方式。

//ManaCount.Java
import lombok.Builder;
import lombok.ToString;

@Builder
@ToString
public class ManaCount {
    private final int redManaCount;
    private final int whiteManaCount;

    private final int blueManaCount;
    private final int greenManaCount;

    private final int blackManaCount;
    private final int colorlessManaCount;

}

用法:

//   ManaMain.java

public class ManaMain {

    public static void main(String[] args) {
        ManaCount manaCount = ManaCount.builder()
                .redManaCount(0)
                .whiteManaCount(0)
                .blueManaCount(0)
                .greenManaCount(0)
                .blackManaCount(0)
                .build();
        System.out.println(manaCount);
    }
}

输出:

ManaCount(redManaCount=0, whiteManaCount=0, blueManaCount=0, greenManaCount=0, blackManaCount=0, colorlessManaCount=0)

【讨论】:

  • 生成器初始化中法力名称的顺序是否重要?
  • 不,没关系。它是构建器设计模式。
【解决方案2】:

也许这听起来很微不足道,但是一旦您想让用户明确地设置您的类组件并明确其名称,那么使用无参数构造函数然后使用一些 setter 应该是一个好主意:

c = new ManaCount();
  c.setRed(red);
  c.setGreen(green);

如果您仍希望通过构造函数实现这样的机制,您可能希望使用类中定义的一些常量来标识组件。如果您的构造函数将一个组件 ID 数组作为其第一个参数,并将一个组件 ID 数组作为其第二个参数,则调用可能看起来像

c = new ManaCount(new int[]{ManaCount.RED,ManaCount.GREEN}, new int[]{red, green});

当然,您可以实现另一种语法变体,以使用用户定义的 id->value 映射列表调用构造函数,可能采用名称-值对数组,或/并采用 @ 987654323@接口初始化等

【讨论】:

    猜你喜欢
    • 2016-08-01
    • 2016-01-03
    • 2012-06-17
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    相关资源
    最近更新 更多