Java枚举toString与访问方法实现及Fan类枚举字段报错解决
问题解决:Speed枚举在Fan类中的使用错误修正
核心错误原因
你遇到的“speed无法解析或不是字段”错误,本质是Fan类未定义Speed类型的成员变量,同时构造方法、toString方法的写法完全不符合Java语法规范。另外原枚举的访问修饰符和命名也不符合Java编码规范,会导致访问权限问题。
逐步修正方案
1. 修正枚举定义(规范+访问权限)
Java枚举名需遵循大驼峰命名法,且若Fan类与枚举不在同一类中,需将枚举的访问修饰符从private改为public(或包访问权限,即移除private):
import java.util.Arrays; import java.util.Optional; public enum Speed { SMALL(1), MEDIUM(2), FAST(3); private final int speedValue; // 加final保证枚举实例不可变性 Speed(int speedValue) { this.speedValue = speedValue; } public int getSpeedValue() { return speedValue; } public static Optional<Speed> fromInt(int speedValue) { return Arrays.stream(Speed.values()) .filter(spe -> spe.speedValue == speedValue) .findFirst(); } }
- 枚举名从
speed改为Speed,符合Java命名规范 - 方法名从
get改为fromInt,语义更清晰 - 给
speedValue添加final修饰,避免意外修改
2. 修正Fan类定义
给Fan类添加Speed类型的成员变量,同时修正构造方法、toString方法:
import java.util.Optional; import java.util.Scanner; public class Fan { private Speed currentSpeed; // 新增Speed类型成员变量 private boolean on; // 构造方法:接收Speed实例和开关状态 public Fan(Speed currentSpeed, boolean on) { this.currentSpeed = currentSpeed; this.on = on; } public boolean isOn() { // 布尔类型getter建议用is开头,符合规范 return on; } public Speed getCurrentSpeed() { return currentSpeed; } // 重写toString方法,返回速度值和开关状态 @Override public String toString() { if (!on) { return "风扇已关闭"; } return "风扇状态:开启,速度值:" + currentSpeed.getSpeedValue(); } public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入速度值(1=低速,2=中速,3=高速):"); int sp = sc.nextInt(); System.out.println("请输入开关状态(true=开启,false=关闭):"); boolean on = sc.nextBoolean(); // 处理枚举转换,同时应对非法输入 Optional<Speed> speedOpt = Speed.fromInt(sp); if (speedOpt.isPresent()) { Fan fan = new Fan(speedOpt.get(), on); System.out.println(fan); // 直接调用toString方法 } else { System.out.println("输入的速度值非法,请输入1、2、3中的一个"); } sc.close(); } }
3. 关键错误点说明
- 构造方法错误:原代码
speed.get() = seed;完全不符合语法,构造方法的作用是给类成员变量赋值,需先定义private Speed currentSpeed;,再通过this.currentSpeed = currentSpeed;完成赋值。 - toString方法错误:原代码
return speed;试图直接返回枚举类型,修正后通过currentSpeed.getSpeedValue()获取对应数值,结合开关状态返回友好信息。 - main方法对象创建错误:原代码
new Fan(sp, on)将int类型传给需要Speed类型的构造方法,类型不匹配。需先从Optional中取出Speed实例,同时处理空值场景(避免用户输入非法值导致异常)。
运行效果
- 输入
2和true时,输出:风扇状态:开启,速度值:2 - 输入
4和true时,输出:输入的速度值非法,请输入1、2、3中的一个
内容的提问来源于stack exchange,提问作者Calvin Lim
相关产品推荐
相关产品推荐

