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

时间:2018-02-04 03:10:01

标签: java readability

我正在为我正在制作的模拟器游戏制作一个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巫术可以实现这一目标?

2 个答案:

答案 0 :(得分:2)

  

我建议你使用龙目岛。这是您使用@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;

}

Ussage:

//   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)

答案 1 :(得分:1)

也许这听起来非常简单,但是一旦你想让用户明确地设置你的类组件的名称,那么使用无参数构造函数然后使用一些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->值映射列表的构造函数,可能采用一组名称 - 值对,或/和java.util.Map接口初始化等。