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

时间:2015-04-01 21:46:26

标签: java javabeans standards getter-setter

我正和一位朋友一起开发基于Java的游戏,我注意到他在可维护性方面采取了一种让我感到担忧的方法。

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

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

  • 选项1

    public void runFast() {
        this.character.speed = 5.0f
    }
    
    public void walk() {
        this.character.speed = 2.0f
    }
    
    public void stop() {
        this.character.speed = 0.0f;
    }
    
  • 选项2

    public void setSpeed(float speedTemp) {
        this.character.speed = speedTemp;
    }
    

5 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

恕我直言,最好的选择是声明常量/枚举,并使用选项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);

答案 2 :(得分:1)

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

如果你将来更多地关注你的速度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;
    }
};

答案 3 :(得分:0)

这取决于。例如

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

  • 走路/跑步/停止走路除了设定速度外还有副作用吗?作为一个人为的例子,开始运行可能会导致角色掉落它所持有的物品,或者停止可能会导致角色滑动一点。在这种情况下,使用单独的方法可能有意义。

  • 或者可能只有少数预定义状态,但根据环境运行速度可能会有所不同。

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

答案 4 :(得分:0)

当您希望代码是可读的并且避免公共类字段可以以错误的方式从另一个类使用时,

getter和setter非常有用。 这个例子说明了重要性。

CLASS A:

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

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

}

CLASS B:

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

这意味着您必须定义一个"修饰符逻辑" (保护,私人,公共)制作制定者和吸气者之前。在修改器之前定义以及定义setter和getter之后。