这是不明智地使用'this'关键字?

时间:2014-08-09 00:29:51

标签: java variables this scope

基本上我有一个名为WarriorSkills的课程,我想根据战士对象武器统计数据更新技能造成的伤害。我可以想办法获得对战士类对象的引用以改变基于战士武器对象(伤害和力量)的勇士技能的统计数据的唯一方法是使用该方法的战士类的参数WarriorSkills类中的getRoughSkillDamageModified()。

头等舱

public class WarriorSkills extends Skills {
private int rageCost;
private double damageModified;

public void getRoughSkillDamageModified(Warrior plc) //By Armour/Weapon stats
{
    damageModified = plc.getWeapon().getAverageDamage() + plc.getStrength();
}

public void updateStats()
{
    this.setStrength(this.getStrength() + this.warriorWeapon.getBonusStrength());
    this.skills.getRoughSkillDamageModified(this);
}

第二课

public class Warrior extends StrengthUser {

private String className = "Warrior";
private StrengthWeapon warriorWeapon;
private WarriorSkills skills;

public Warrior(Warrior originalObject)
{
    super(originalObject);
}

public Warrior(int stam, int health, int resi, int str, int rage, StrengthWeapon 
warrWep, WarriorSkills warSkill)
{
    super(stam, health, resi, str);
    this.skills = warSkill;
    this.warriorWeapon = warrWep;
}

public String getClassName()
{
    return className;
}

public void updateStats()
{
    this.setStrength(this.getStrength() + this.warriorWeapon.getBonusStrength());
    this.skills.getRoughSkillDamageModified(this);
}


public StrengthWeapon getWeapon()
{
   return this.warriorWeapon;
}

public WarriorSkills warriorSkills()
{
    return this.skills;
}

}

但是你可以看到为了调用这个方法(在Warrior类中)我必须使用 '这'将Warrior类表示为调用对象并作为参数传递。现在使用这个'这个'关键字对我来说似乎很奇怪,但似乎确实有用。它是按照惯例或任何事情避免的,还是有任何潜在的问题。我的书似乎还没有通知我,我总是喜欢尝试。

更新了完整的类定义。注意Warrior类继承自一个继承自PlayerClass类的StrengthUser类。 WarriorSkill继承自Skill类。 编辑:该死的忘了省略小提琴代码= / Bleh再次更新,自我注意:在提问和发布完整课程之间不要乱码。首先是问题所在的方法调用是丢失大声笑。它现在又来了。

2 个答案:

答案 0 :(得分:4)

示例代码中使用this.的所有地方都是不必要的。但是,您可以自行决定是否“明智”。

这是一个意见问题。

有些人认为使用this.提高可读性会明确表示您正在使用/调用的字段或方法是目标类的成员。我不认为这有帮助,除了可能是Java初学者。

但是,有些情况下必要符合this的资格; e.g。

public class Example {
    private int field;
    public void setField(int field) {
        this.field = field;  // 'this' is required here ...
    }
}

如果你问的是...... skills.getRoughSkillDamageModified(this),那么将当前对象的引用作为参数传递给其他方法或构造函数绝对没有“不明智”。

答案 1 :(得分:1)

如果只需要两个值,为什么要传递对象?传递对象意味着WarriorSkills类最终了解Warrior类的内部工作方式,而不是它真正需要的。

相反,在Warrior课程中(省略this的不必要用途):

skills.getRoughSkillDamageModified(getWeapon().getAverageDamage(), getStrength());

并在WarriorSkills类中(假设两个参数都是双精度数):

public void getRoughSkillDamageModified(double avgDamage, double strength)
{
    damageModified = avgDamage + strength;
}

此外,类似getFoo的方法名称通常会返回foo的值。将此方法setRoughSkillDamageModified命名为

会更好