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