我正在制作一个拥有大量资源的小游戏,我正在考虑一个名为“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语句,它只确定每个方法中哪个成员变量要改变。因为这感觉就像我在我的所有方法中使用的一个功能,我想知道是否有办法将它隔离到它自己的方法而不是简单地调用它。
我已经找到了解决这个问题的方法但是我总是让事情变得更加困难,或者最终将重复的代码分散到多个类中,这不是一个改进。非常感谢提前!
答案 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);
}
}