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

如何排查Java实例方法调用情况并修正FunPark类折扣计算逻辑错误

问题根源分析

你的代码逻辑核心问题在于:你用已经打过折扣的totalPrice值来判断用户已选活动。一旦应用折扣后,totalPrice不再是原价的累加值,后续的条件判断自然会失效。

举个例子拆解你的调用流程:

  1. 调用park.trampoline():totalPrice被设为12(蹦床原价)
  2. 调用park.climbWall():此时totalPrice是12,符合第一个if条件(等于蹦床原价),先加攀岩的10元变成22,再打10折得到19.8,totalPrice现在是19.8
  3. 调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 20:37:36