如何防止为成员变量创建重复方法?

时间:2016-09-13 09:40:12

标签: java refactoring

用于模拟字段的重复方法

我正在制作一个拥有大量资源的小游戏,我正在考虑一个名为“ResourceManager”的类来处理这些成员变量所需的操作。我已经意识到的是,我实现它的方式导致很多类似的代码,这让我很烦恼。

public class ResourceManager{
    private float resourceA = 0;
    private float resourceB = 0;
    private float resourceC = 0;

    public enum ResouceType{
        A,B,C
    }

    public void add(ResourceType type,float amount){
        switch(type){
        case ResourceType.A: resourceA += amount;
             break;
        case ResourceType.B: resourceB += amount;
             break;
        case ResourceType.C: resourceC += amount;
             break;
        }
    }
}

这是我所拥有的代码的一部分。这不会打扰我,但我也加入了减法,乘法,devide。 。 。现在我有这个switch语句,它只确定每个方法中哪个成员变量要改变。因为这感觉就像我在我的所有方法中使用的一个功能,我想知道是否有办法将它隔离到它自己的方法而不是简单地调用它。

我已经找到了解决这个问题的方法但是我总是让事情变得更加困难,或者最终将重复的代码分散到多个类中,这不是一个改进。非常感谢提前!

1 个答案:

答案 0 :(得分:1)

您可以将值存储在Map

final Map<ResourceType, Float> resources;

public ResourceManager() {
    this.resources = new EnumMap<>(ResourceType.class);
    for (ResourceType r : ResourceType.values()) {
        resources.put(r, 0f);
    }
}

public enum ResourceType {
    A,B,C
}

public void add(ResourceType type, float amount) {
    resources.merge(type, amount, Float::sum);
}

或者,您可以添加一个方法来获取和设置枚举值:

public class ResourceManager {

    private float resourceA = 0;
    private float resourceB = 0;
    private float resourceC = 0;

    public enum ResourceType {

        A {

            @Override
            protected void setResource(ResourceManager manager, float newValue) {
                manager.resourceA = newValue;
            }

            @Override
            protected float getResource(ResourceManager manager) {
                return manager.resourceA;
            }
        }, B {

            @Override
            protected void setResource(ResourceManager manager, float newValue) {
                manager.resourceB = newValue;
            }

            @Override
            protected float getResource(ResourceManager manager) {
                return manager.resourceB;
            }
        }, C {

            @Override
            protected void setResource(ResourceManager manager, float newValue) {
                manager.resourceC = newValue;
            }

            @Override
            protected float getResource(ResourceManager manager) {
                return manager.resourceC;
            }
        };

        protected abstract void setResource(ResourceManager manager, float newValue);

        protected abstract float getResource(ResourceManager manager);
    }

    public void add(ResourceType type, float amount) {
        type.setResource(this, type.getResource(this) + amount);
    }

    public void multiply(ResourceType type, float amount) {
        type.setResource(this, type.getResource(this) * amount);
    }
}