You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 13:46:29