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

Java方法被重复调用,需保留方法独立性仅单次执行获取返回值

问题根因

你当前代码重复执行X/Y/Z方法的核心原因是流程上存在两次调用:balloonsNeeded方法首先调用roomVolume,roomVolume内部会执行一次X/Y/Z触发用户输入长宽高;后续balloonsNeeded自身又主动调用了一次X/Y/Z,导致重复执行输入逻辑。

解决方案1:参数传递(推荐,无副作用)

这个方案不需要修改X/Y/Z方法的原有逻辑,仅调整roomVolume的参数列表和调用逻辑,完全保留所有方法独立性:

  1. 修改roomVolume方法,让它接收外部传入的三个轴的数值,不再内部调用X/Y/Z:
// 仅修改方法签名和内部取数逻辑,计算逻辑完全保留
public static double roomVolume(double axisx, double axisy, double axisz){
    double rvDouble;
    final int million = 1000000;
    double rvRounded;

    // 删掉原有内部调用X/Y/Z的代码,直接使用传入的参数
    rvDouble = (axisx*axisy*axisz)/million;
    rvRounded = (double)Math.round(rvDouble*100)/100;
    return rvRounded;
}
  1. 修改balloonsNeeded方法,先调用X/Y/Z拿到数值,再传给roomVolume:
public static int balloonsNeeded(){
    int bNeeded;
    double bNdouble;

    // 先拿一次X/Y/Z的结果
    double ax = X();
    double ay = Y();
    double az = Z();
    // 把拿到的数值传给roomVolume计算体积
    double rVol = roomVolume(ax, ay, az);
    double bVol = balloonVolume();

    bNdouble = rVol/bVol;
    bNeeded = (int)bNdouble;

    System.out.println("The dimensions you entered are " + ax + "x" + ay + "x" + az + "cm." );
    System.out.println("This means your rooms volume is " + rVol + "m³");
    System.out.println("You will need " + bNeeded + " balloons to fill the room.");
    return bNeeded;
}

这个方案的优势是没有全局状态,后续如果需要计算多个不同房间的体积,直接传入不同的参数即可,不会出现逻辑冲突。

解决方案2:方法返回值缓存(无需修改方法签名)

如果要求完全保留所有原有方法的签名(包括roomVolume的无参定义),可以给X/Y/Z方法增加静态缓存,第一次调用执行输入逻辑并存储结果,后续调用直接返回缓存值:
以X方法为例,修改后代码如下,Y、Z方法同理修改即可:

// 增加静态缓存变量和初始化标记
private static double xCache;
private static boolean xInitialized = false;

public static double X() {
    // 已经初始化过直接返回缓存值
    if (xInitialized) {
        return xCache;
    }
    String x;
    double xDouble;

    System.out.println("What is the rooms width in cm?");
    x = scanner.nextLine();

    if (x.matches(".*[a-zA-Z.*]")) {
        System.out.println("The value you entered is invalid, please enter a value using only [0-9]");
        return X();
    } else {
        xDouble = Double.parseDouble(x);
    }

    if (xDouble <= 0) {
        System.out.println("The value you entered is 0 or smaller, please enter a value larger than 0");
        return X();
    } else {
        // 存储缓存值,标记已初始化
        xCache = xDouble;
        xInitialized = true;
        return xDouble;
    }
}

注意这个方案的缓存是全局生效的,程序运行期间只会取第一次输入的长宽高数值,适合仅计算单个房间的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 05:45:03