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

静态函数degrees返回Angle类型时代码无法编译的原因是什么

Angle类代码修复方案

核心错误点

  • 成员变量错误使用static修饰:静态变量属于类全局共享,会导致所有Angle实例的角度、弧度值互相覆盖,应该改为实例成员变量,每个对象单独存储自身的角度、弧度值。
  • 静态工厂方法未实例化对象:degrees方法中仅声明了Angle angle1变量,没有通过new创建实例,直接调用方法会触发未初始化局部变量的编译错误,运行也会触发空指针异常。
  • radians方法缺少返回值:方法声明返回Angle类型,但当前没有返回任何对象,编译不通过。
  • 单位转换逻辑颠倒:Math.toDegrees是将弧度值转为角度值,Math.toRadians是将角度值转为弧度值,原代码两类转换逻辑写反,数值计算结果完全错误。
  • setter方法返回值逻辑错误:setRadians方法错误返回角度值gradmass,不符合set方法常规设计,也会导致赋值逻辑异常。

修复后完整代码

public class Angle {
    // 改为实例成员变量,每个Angle对象单独存储自身的角度、弧度值
    private double gradmass; // 角度值
    private double bogenmass; // 弧度值

    // 私有构造方法,强制通过静态工厂方法创建实例
    private Angle() {}

    // 输入角度值,创建Angle对象
    public static Angle degrees(double angle) {
        Angle angle1 = new Angle();
        angle1.setDegrees(angle);
        return angle1;
    }

    // 输入弧度值,创建Angle对象
    public static Angle radians(double angle) {
        Angle angle1 = new Angle();
        angle1.setRadians(angle);
        return angle1;
    }

    public double getDegrees() {
        return gradmass;
    }

    public void setDegrees(double gradM) {
        this.gradmass = gradM;
        this.bogenmass = Math.toRadians(gradM);
    }

    public double getRadians() {
        return bogenmass;
    }

    public void setRadians(double bogenM) {
        this.bogenmass = bogenM;
        this.gradmass = Math.toDegrees(bogenM);
    }
}

优化说明

  • 新增私有构造方法,避免外部随意创建未初始化的Angle实例,强制通过degrees、radians两个静态工厂方法创建对象,保证角度、弧度值始终同步。
  • 修改setter逻辑,调用任意set方法会自动同步更新另一个单位的数值,避免两类数值不一致的问题。
  • 不需要手动分别设置两个单位的值,传入任意单位的数值,类内部自动完成转换同步。

内容的提问来源于stack exchange,提问作者Atlas v2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 02:15:03