【问题标题】:How do I prevent creating duplicate methods for member variables?如何防止为成员变量创建重复的方法?
【发布时间】:2017-01-20 20:45:03
【问题描述】:

模拟字段的重复方法

我正在制作一个包含大量资源的小游戏,我正在考虑使用一个名为“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 语句,它只确定每个方法中要更改的成员变量。由于这感觉就像我在所有方法中使用的一个功能,我想知道是否有办法将其隔离到它自己的方法中,而不是简单地调用它。

我想办法解决这个问题,但我总是让事情变得更加困难,或者最终导致重复的代码分布在多个类中,这并不是真正的改进。提前非常感谢!

【问题讨论】:

  • 听起来你真的想要一个Map<ResourceType, Float> 而不是三个变量。
  • 还没有想到。比我只使用地图中的 ResourceType 查找 Float 并更改它。谢谢!我马上试试!

标签: java refactoring


【解决方案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);
    }
}

【讨论】:

    猜你喜欢
    • 2014-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 2021-08-03
    相关资源
    最近更新 更多