Java 将方法参数作为对象传递的能力';要改变的状态

Java 将方法参数作为对象传递的能力';要改变的状态,java,object,methods,parameters,this,Java,Object,Methods,Parameters,This,我实际上有两个问题,关于如何正确地做到这一点。我对Java编程相当陌生,这使得我想做的事情很难自己去做,也不需要问任何问题 我的第一个问题是,我在这里使用的“这个”术语正确吗?我有一个包含大量不同元素的构造函数,其中两个元素是“attack”和“attackLvl”。此方法是否会正确更新元素 public void updateAttack(int xp){ this.attack = xp; this.attackLvl = levelFromXP(this.attack);

我实际上有两个问题,关于如何正确地做到这一点。我对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();
}
  • 是的,您的用法是正确的,但不是必需的

  • “技能”是一个全局变量吗?如果是,则不需要再在同一类的方法中传递它。特别是,

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

  • 'this'仅当命名中存在歧义时才需要。

    代码没有提供足够的信息来确定您是否正确使用了它。但是一般来说,如果类中的
    attack
    attackLvl
    是字段,那么您就正确地使用了它。例如:

    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();
        }
    }
    
    如果您需要多种技能,请按姓名:

    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);
    }
    
    protectedmap skillLevelMap=newtreemap();
    public int getSkillLevel(字符串技能){
    整数级别=skillLevelMap.get(技能);
    返回(级别!=null)?级别:0;
    }
    公共技能等级(字符串技能,智力等级){
    技能等级图。放置(技能,等级);
    }
    
    这避免了为不同的技能编写5-20个不同的getter/setter。

    One

    是的,您在此处正确使用了
    关键字。在您的情况下(参数有另一个名称作为成员变量),甚至不需要这样做–但建议每次调用类的成员变量时都使用
    this
    。因此,继续使用它,就像您在示例中已经使用的那样,以保持代码的可读性和干净性

    两个

    我猜你打算做的是对变量进行某种动态命名,所以你最终会得到

    this.attackSkill = xp;
    this.attackSkillLvl = levelFromXP(this.attackSkill);
    this.defenseSkill = xp;
    this.defenseSkillLvl =  levelFromXP(this.defenseSkill);
    
    我是否正确解释了您的伪代码示例

    无论如何,正如您所知,动态命名变量是不可能的–仅当您使用
    映射
    (例如
    哈希映射
    )时,您可以根据需要将值分配给键:

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

    但这取决于你在课堂上喜欢的其他“技能”价值观以及你使用的价值观。如果你一定要使用所有20多种不同的技能,我建议你使用一个普通的
    列表
    数组

    你没有一个包含大量不同元素的“构造函数”。。这里有一个对象,其中包含一组字段,您可能(我们看不到)以前在构造函数中设置过这些字段。您所拥有的看起来是正确的,但我们不知道这是用来表示什么类的,所以很难说。我不同意您的说法,即只有在存在歧义时才使用
    这个
    。在类实例变量前面加上
    this
    super
    可以为其他阅读代码的开发人员提供额外的上下文。我总是在我编写的类字段前面加上“this.”前缀。这非常清楚,非常有助于避免非功能性赋值。我不使用其他前缀,例如setter参数,只是通过“this”来区分。“Hitpoints”、“XP”或“Level”是玩家的明显属性。。但是是“攻击”吗?@ThomasW我不知道,我只是想通过在类中包装这些字段来添加一些上下文来证明我的观点。OP没有提供足够的上下文来准确地回答这个问题,所以我只是尝试提供一个将其用于一些类实例变量的示例。
    this.skillMap.get("attackSkill") // returns the levelFromXP(attackSkillXP);