利用构建器模式,我注意到在某些情况下,最好通过传递无限参数的构建器方法一次更改多个值。

例如,说我想做这样的事情:

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/

10-10 01:54