Java 如何防止为成员变量创建重复的方法? 模拟场的复制方法

Java 如何防止为成员变量创建重复的方法? 模拟场的复制方法,java,refactoring,Java,Refactoring,我正在制作一个有很多资源的小游戏,我想用一个叫做“ResourceManager”的类来处理这些成员变量所需的操作。不过,我逐渐意识到,我实现它的方式导致了大量的模拟代码,这让我感到困扰 public class ResourceManager{ private float resourceA = 0; private float resourceB = 0; private float resourceC = 0; public enum ResouceTyp

我正在制作一个有很多资源的小游戏,我想用一个叫做“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;
        }
    }
}
这是我的代码的一部分,这并不困扰我,但我也加入了减法,乘法,微分。现在我有了这个switch语句,它只决定在每个方法中修改哪个membervariable。因为这感觉像是我在所有方法中使用的一个功能,我想知道是否有一种方法可以将它隔离到它自己的方法中,而不是简单地调用它


我想了很多方法来解决这个问题,但我总是让事情变得更加困难,或者让重复的代码分散到多个类中,这并不是一个真正的改进。非常感谢

您可以将值存储在
映射中

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);
}

听起来你真的想要一个
Map
,而不是三个变量。我还没想过。然后我会在地图中使用ResourceType查找浮点值并修改它。谢谢我马上就去试试!
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);
    }
}