Java方法被重复调用,需保留方法独立性仅单次执行获取返回值
问题根因
你当前代码重复执行X/Y/Z方法的核心原因是流程上存在两次调用:balloonsNeeded方法首先调用roomVolume,roomVolume内部会执行一次X/Y/Z触发用户输入长宽高;后续balloonsNeeded自身又主动调用了一次X/Y/Z,导致重复执行输入逻辑。
解决方案1:参数传递(推荐,无副作用)
这个方案不需要修改X/Y/Z方法的原有逻辑,仅调整roomVolume的参数列表和调用逻辑,完全保留所有方法独立性:
- 修改
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; }
- 修改
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
相关产品推荐
相关产品推荐

