2013-05-08 38 views
0

实际上,我有两个关于如何正确执行此操作的问题。我对Java编程相当陌生,这让我自己想要做的很难,也没有提出任何问题。将方法参数作为对象状态进行更改的能力

我的第一个问题是,我在这里正确使用“this”这个词吗?我有一系列不同元素的构造函数,其中两个元素是“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(); 
} 
+0

你没有一个“构造函数”,有一堆不同的元素..你有一堆_fields_在这里,你可能(我们看不到)已经在构造函数中设置过。你有什么看法是正确的,但我们不知道这是什么课程,因此很难说。 – 2013-05-08 00:57:32

回答

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

'这个'只需要是否有歧义的命名。

+1

我不同意你的声明只有在存在歧义时才使用'this'。用'this'或'super'加上类前缀的实例变量可以为阅读代码的其他开发者提供额外的上下文。 – 2013-05-08 00:58:45

+1

我总是在类字段的前面添加“this”。字首。这非常清楚,并且对避免非功能性分配非常有帮助。例如,我不使用其他前缀。 setter参数,只需通过'this'区分即可。 – 2013-05-08 01:01:40

+0

谢谢!只是错误的措辞,编辑。 – renz 2013-05-08 01:02:29

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(); 
    } 
} 
+0

'Hitpoints','XP'或'Level'是玩家的明显属性..但是'Attack'? – 2013-05-08 00:59:40

+0

@ThomasW我不知道,我只是试图添加一些上下文,将这些字段封装在一个类中以证明我的观点。 OP没有提供足够的上下文来准确地回答这个问题,所以我只是试图提供一个在某些类实例变量中使用它的例子。 – 2013-05-08 01:00:47

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 /不同类型技能的制定者。

+0

+1为您的详细示例代码 – GameDroids 2013-05-08 01:13:39

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

但要看什么其他的“功力” v你喜欢在你的班级中使用哪种线索,以及你使用哪种线索。如果您确定始终使用所有20多种不同的技能,我会推荐一个正常的ListArray

相关问题