将方法参数作为要更改的对象状态传递的能力

时间:2013-05-08 00:50:02

标签: java object methods parameters this

我实际上有两个关于如何正确执行此操作的问题。我是Java编程的新手,这使得我自己很难做到并且不问任何问题。

我的第一个问题是,我在这里正确使用“这个”一词吗?我有一个带有许多不同元素的构造函数,其中两个元素是“attack”和“attackLvl”。这种方法会正确更新元素吗?

public void updateAttack(int xp){
    this.attack = xp;
    this.attackLvl = levelFromXP(this.attack);
    updateOverall();
}

其次,关于如何达到某种结果更是一个广泛的问题。我可以制作20多个不同的方法,比如上面的方法,但我宁愿将参数传递给语句,如下例所示,但我不知道该怎么做:

public void updateAttack(int xp, String skill){
    this.(skill) = xp;
    this.(skill + "Lvl") = levelFromXP(this.skill);
    updateOverall();
}

4 个答案:

答案 0 :(得分:1)

如果您想要多种技能,请按名称:

protected Map<String,Integer> skillLevelMap = new TreeMap();

public int getSkillLevel (String skill) {
    Integer level = skillLevelMap.get( skill);
    return (level != null) ?  level : 0;
}
public void setSkillLevel (String skill, int level) {
    skillLevelMap.put( skill, level);
}

这可以避免为不同类型的技能编写5-20个不同的getter / setter。

答案 1 :(得分:0)

  1. 是的,您对此的使用是正确的,但不是必需的。

  2. '技能'是GLOBAL变量吗?如果是,则不需要在同一类的方法中传递它。特别是,

    public void updateAttack(int xp){
      skill = xp; //but compiler error since xp is an int and skill is a String
      skill = "Lvl1" + levelFromXP(skill);
      updateOverall();
    }
    
  3. 只有在命名时含糊不清时才需要

    'this'

答案 2 :(得分:0)

代码没有提供足够的信息来确定您是否正确使用此功能。但一般情况下,attackattackLvl是您班级中的字段,您正确使用它。例如:

public class Player(){
    String attackLvl;
    int attack;

    public void updateAttack(int xp){
       this.attack = xp; //reference fields on this class is proper use
       this.attackLvl = levelFromXP(this.attack);
       updateOverall();
    }
}

答案 3 :(得分:0)

<强>一

是的,您在这里正确使用this关键字。在您的情况下(参数具有另一个名称作为成员变量)甚至不需要 - 但是每次调用类的成员变量时都建议使用this。因此,请继续使用它,因为您已经在示例中使用它,以保持代码的可理解性和清洁性。

<强>两个

我想你打算做的是你的变量的某种动态命名,所以你最终会得到像

这样的东西
this.attackSkill = xp;
this.attackSkillLvl = levelFromXP(this.attackSkill);
this.defenseSkill = xp;
this.defenseSkillLvl =  levelFromXP(this.defenseSkill);

我是否正确解释了伪代码示例?

无论如何,您知道无法动态命名变量 - 仅当您使用Map(例如HashMap)时,您可以将值分配给密钥,因为你需要它们:

this.skillMap = new HashMap<String,Integer> ();
this.skillMap.put(skill, levelFromXP(skill);

然后您的skill字符串将成为您可以访问该技能值的关键字:

this.skillMap.get("attackSkill") // returns the levelFromXP(attackSkillXP);

但这取决于你喜欢在课堂上拥有的其他“技能”值以及你使用的那些。如果您确定始终使用所有20多种不同技能,我建议您使用正常的ListArray