如何最好地使可读的过多构造函数参数

How best to make readable excessive constructor parameters

我正在为我正在开发的模拟器游戏制作一个 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 魔法可以实现这一点?

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

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

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

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

当然,您可以实现另一种语法变体来调用具有用户定义的 id->value 映射列表的构造函数,可能采用名称-值对数组, or/and 取java.util.Map 接口初始化等

I would suggest you to Use Lombok. This is how you use @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)