利用构建器模式,我注意到在某些情况下,最好通过传递无限参数的构建器方法一次更改多个值。
例如,说我想做这样的事情:
public class Element {
String name;
Double fire, water, earth, air, dark, light;
Element(Builder e) {
name = e.name;
fire = e.fire; water = e.water; earth = e.earth;
air = e.air; dark = e.dark; light = e.light;
}
static class Builder {
String name;
// Default multipliers
Double fire = 1.0, water = 1.0, earth = 1.0, air = 1.0, dark = 1.0, light = 1.0;
Builder(String name){ this.name = name; }
public Builder setRes(Double... element) {
for (int i = 0; i < element.length; i++) { element[i] = 0.5; }
return this;
}
public Builder setVuln(Double... element) {
for (int i = 0; i < element.length; i++) { element[i] = 2.0; }
return this;
}
public Builder setImmune(Double... element) {
for (int i = 0; i < element.length; i++) { element[i] = 0.0; }
return this;
}
public Element create(){ return new Element(this); }
}
}
编译没有错误。这些类型可能只包含0、0.5、1或2的确定值。给定多个“元素”,这是我想到的必须每个“元素”创建3个方法的问题,但是问题就来了,因此我的问题就在时间到了实例化一个新元素-这将如何/将如何工作?甚至有可能还是我坚持使用多种方法?
我问的原因是,我看不到如何传递尚未初始化的实例的值。
直觉会让我(错误地)这样做
Element nora = new Element.Builder("Nora").setVuln(nora.dark, nora.light).create();
最佳答案
我可能会更改模型以使用Enum
将元素类型的映射保存为乘数,并且在构建元素时,将Enum
字段传递给“ resistance”,“ vulnerability”和“ immunity”,类似于以下内容:
public enum ElementType {
DARK,
LIGHT // ...
}
public class Element {
String name;
Map<ElementType, Double> multipliers = ...;
// ...
public Builder vulnerability(ElementType... elementTypes) {
for (ElementType elementType : elementTypes) {
multipliers.put(elementType , 2.0);
}
return this;
}
}
Element nora = new Element.Builder("Nora").vulnerability(ElementType.DARK, ElementType.LIGHT).create();
关于java - 生成器模式和无限参数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25420848/