Java调用turnLeft方法修改枚举变量值未生效是什么原因
问题根因
代码不生效的核心原因有两个:
- 变量名遮蔽(Variable Shadowing):
turnLeft方法的形参和类成员变量都命名为direction,方法内不带this.前缀的direction会默认指向传入的形参,而非对象自身的成员变量。虽然你赋值时用this.direction指定了修改成员变量,但判断逻辑完全基于外部传入的形参,根本不是基于成员变量的当前值做左转,和预期逻辑偏差极大。 - 方法设计不符合需求,对值传递机制有误解:你的需求是修改对象自身的方向状态实现左转,这个逻辑根本不需要外部传参。当前方法的实际逻辑是:不管成员变量当前是什么方向,都把它强制改成「传入参数左转后的结果」。如果你误以为把外部的方向变量当参数传入,方法就能修改那个外部变量,肯定会得到“值没变化”的结果——Java是值传递,方法内操作的是形参的副本,你修改
this.direction只会改变当前对象的成员变量,和调用方传入的外部变量没有任何关系。
修复方式
去掉turnLeft方法的多余形参,判断逻辑直接操作成员变量即可,从根源上避免重名歧义:
enum Direction{ UP, RIGHT, DOWN, LEFT } private Direction direction = Direction.DOWN; public void turnLeft() { switch(this.direction) { case UP: this.direction = Direction.LEFT; break; case RIGHT: this.direction = Direction.UP; break; case DOWN: this.direction = Direction.RIGHT; break; case LEFT: this.direction = Direction.DOWN; break; } }
修复后直接调用turnLeft()方法,就会基于当前对象存储的方向值完成左转,成员变量会正常更新。
内容的提问来源于stack exchange,提问作者Simplicissimus
相关产品推荐
相关产品推荐

