如何最好地使可读的过多构造函数参数
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)
我正在为我正在开发的模拟器游戏制作一个 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)