Setter 方法,多个没有参数或单个有值?

Setter methods, multiple with no parameters or single with value?

我正在和一个朋友一起开发基于 java 的游戏,我注意到他采用的方法在可维护性方面与我有关。

对于表示可播放 Character 的 class,他不是只创建 1 个方法来设置对象的 属性,而是创建单独的方法来将 属性 设置为特定值。

这 2 个选项中的哪一个最适合继续前进?

恕我直言,最好的选择是声明 constants/enums,并使用选项 2.


示例(常量):

public static final float STOP = 0.0f;
public static final float WALK = 2.0f;
public static final float FAST = 5.0f;

setSpeed(STOP|WALK|FAST);

示例(枚举):

public enum Speed
{
    FAST(5.5f),
    STOP(0),
    WALK(2.5f);

    float value;

    Speed(float pValue)
    {
        this.value = pValue;
    }

    public float getValue()
    {
        return this.value;
    }
}

setSpeed(Speed.FAST);

为什么不使用枚举来设置速度 - 那么你仍然可以

void setSpeed(Speed speed) {
  this.character.speed = speed.getAmount();
}

与:

enum Speed {
  FAST(5.0f), WALK(2.0f), STOP(0.0f);

  private final float amount;
  private Speed(flaot a) { this.amount = a; }
  public float getAmount() {
    return amount;
  }
}

这样,您可以快速更新值,但仍然有预定义的数量。它灵活且易于维护。您可能想要保存枚举而不是浮点数。

我的解决方案是改用枚举,

如果您将来对速度 maxHeartRate 有更多的要求,它会更简洁,具有更多上下文并且易于扩展。

public class Character {

    private Speed speed;

    public Speed getSpeed() {
        return speed;
    }

    public void setSpeed(Speed speed) {
        this.speed = speed;
    }
};



public enum Speed {

    STOP(0),

    RUN(5.5),

    WALK(2.5);

    double value;

    Speed(double value) {
        this.value = value;
    }

    public double getValue() {
        return value;
    }
};

视情况而定。例如

  • 速度是否受限于几个预定义的值?在这种情况下,使用 enum 将是一个很好的解决方案。

  • 步行/运行宁/停止除了设置速度外还有副作用吗?举个人为的例子,开始 运行 可能会导致角色掉落它持有的物品,或者停止可能会导致角色稍微打滑。在这种情况下,使用单独的方法可能是有意义的。

  • 或者可能只有几个预定义的状态,但是根据环境运行宁速度可能会有所不同。

归结为:哪种对角色属性进行概念建模的方式最适合您的游戏逻辑/物理?解决这个问题,然后将 类 的界面基于此。不要太在意早期的确切 API,这类东西很容易重构。

getter 和设置器在您希望代码可读并避免 public class 字段以错误的方式从另一个 class是的。 这个例子说明了重要性。

CLASS答:

 public class ClassA{     
 // in the body class
 private String fieldClass1;

//classic setter
public void setfieldClass1(String f1)
{
 fieldClass1 = f1;
}

}

CLASS乙:

public class ClassB{   
// in the bodyclass
public String fieldClass2;

//classic setter
public void setfieldClass2(String f2)
{
 setfieldClass2 = f2; 
}    

CLASS C:

public class ClassC{

//in the body of the class this method use class a and class b
public void calc()
{
 ClassA aObject = new ClassA();
 ClassB bObject = new ClassB();
 ClassA.fieldClass1 = 5 + 5; // illegal expression for the compiler and costrain the developer to use setters
 ClassB.fieldClass2 = 8 + 8; // legal expression
}
 }

这意味着您必须在 make setter 和 getter 之前定义一个 "modifiers logic"(受保护的、私有的、public)。在修饰符之前定义,在定义设置器和 getter 之后定义。