如何排查Java实例方法调用情况并修正FunPark类折扣计算逻辑错误
问题根源分析
你的代码逻辑核心问题在于:你用已经打过折扣的totalPrice值来判断用户已选活动。一旦应用折扣后,totalPrice不再是原价的累加值,后续的条件判断自然会失效。
举个例子拆解你的调用流程:
- 调用
park.trampoline():totalPrice被设为12(蹦床原价) - 调用
park.climbWall():此时totalPrice是12,符合第一个if条件(等于蹦床原价),先加攀岩的10元变成22,再打10折得到19.8,totalPrice现在是19.8 - 调用
park.waterSlide():此时判断totalPrice是否等于攀岩+蹦床的原价总和22,但当前totalPrice是19.8,不匹配条件,所以走else分支直接把totalPrice设为水滑梯的15元——这就是你得到15.0的原因。
修正方案
正确思路是单独记录用户已选活动的数量(或具体活动),不依赖折扣后的价格反推。这里提供两种简洁的修正方式:
方式1:用计数+原价累加(无重复选择限制)
这种方式适合不考虑用户重复选择同一活动的场景,逻辑最简洁:
public class FunPark { private final int climbWallPrice = 10; private final int trampoliningPrice = 12; private final int waterSlidesPrice = 15; private int selectedActivityCount = 0; private float originalTotal = 0; public float getTotalPrice() { if (selectedActivityCount == 2) { return applyDiscountTo(originalTotal, 10); } else if (selectedActivityCount == 3) { return applyDiscountTo(originalTotal, 20); } return originalTotal; } private float applyDiscountTo(float applyTo, int discountInPercent) { return applyTo * (1 - (float) discountInPercent / 100); } public void climbWall() { originalTotal += climbWallPrice; selectedActivityCount++; } public void trampoline() { originalTotal += trampoliningPrice; selectedActivityCount++; } public void waterSlide() { originalTotal += waterSlidesPrice; selectedActivityCount++; } }
方式2:支持防重复选择(更严谨)
如果需要避免用户重复选择同一活动,可以用集合记录已选活动,再根据集合大小计算折扣:
import java.util.HashSet; import java.util.Set; public class FunPark { private final int climbWallPrice = 10; private final int trampoliningPrice = 12; private final int waterSlidesPrice = 15; private final Set<String> selectedActivities = new HashSet<>(); public float getTotalPrice() { float originalTotal = calculateOriginalTotal(); int count = selectedActivities.size(); if (count == 2) { return applyDiscountTo(originalTotal, 10); } else if (count == 3) { return applyDiscountTo(originalTotal, 20); } return originalTotal; } private float calculateOriginalTotal() { float total = 0; if (selectedActivities.contains("climbWall")) total += climbWallPrice; if (selectedActivities.contains("trampoline")) total += trampoliningPrice; if (selectedActivities.contains("waterSlide")) total += waterSlidesPrice; return total; } private float applyDiscountTo(float applyTo, int discountInPercent) { return applyTo * (1 - (float) discountInPercent / 100); } public void climbWall() { selectedActivities.add("climbWall"); } public void trampoline() { selectedActivities.add("trampoline"); } public void waterSlide() { selectedActivities.add("waterSlide"); } }
验证结果
用你的Main类调用修正后的代码:
public class Main { public static void main(String[] args) { FunPark park = new FunPark(); park.trampoline(); park.climbWall(); park.waterSlide(); System.out.println(park.getTotalPrice()); // 输出29.6,符合预期 } }
内容的提问来源于stack exchange,提问作者zeplika
相关产品推荐
相关产品推荐

