静态函数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
相关产品推荐
相关产品推荐

