【问题标题】:How do I implement pass-by-value in selected scenario?如何在选定的场景中实现按值传递?
【发布时间】:2021-01-18 03:30:24
【问题描述】:

我在项目中实现传递值时遇到了一点问题。在buyOptionfillOptiontakeOption 的情况下。

我不知道如何使更改的值应用于整个程序而不仅仅是方法。任何提示/解决方案/反馈将不胜感激。

public class CoffeeMachine {

    static int water = 400;
    static int milk = 540;
    static int beans = 120;
    static int cups = 9;
    static int money = 550;
    static boolean exit = false;

    public static void main(String[] args) {
        do {
            printMenu(water, milk, beans, cups, money);
        } while (!exit);
    }

    private static void printMenu(int water, int milk, int beans, int cups, int money) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("Write action (buy, fill, take, remaining, exit): ");
        String input = scanner.nextLine();

        switch (input) {
            case "buy":
                buyOption(water, milk, beans, cups, money);
                break;

            case "fill":
                fillOption(water, milk, beans, cups, money);
                break;

            case "take":
                takeOption(water, milk, beans, cups, money);
                break;

            case "remaining":
                contentOption(water, milk, beans, cups, money);
                break;

            case "exit":
                exit = true;
                System.exit(0);
                break;

            default:
                System.out.println("Wrong option!");
                break;
        }
    }

    private static void contentOption(int water, int milk, int beans, int cups, int money) {
        System.out.println("The coffee machine has: ");
        System.out.println(water + " of water");
        System.out.println(milk + " of milk");
        System.out.println(beans + " of coffee beans");
        System.out.println(cups + " of disposable cups");
        System.out.println(money + " of money");
    }

    private static void buyOption(int water, int milk, int beans, int cups, int money) {
        Scanner scanner = new Scanner(System.in);

        String temp = null;

        System.out.println("What do you want to buy? 1 - espresso, 2 - latte, 3 - cappuccino: ");

        String input = scanner.nextLine();

        switch (input) {
            case "1":
                if (water >= 250 && beans >= 16 && cups >= 1) {
                    water -= 250;
                    beans -= 16;
                    cups -= 1;
                    money += 4;
                    System.out.println("I have enough resources, making you a coffee!");
                } else {
                    if (water < 250) {
                        temp = "water";
                    } else if (beans < 16) {
                        temp = "beans";
                    } else if (cups < 1) {
                        temp = "cups";
                    }
                    System.out.println("Sorry, not enough " + temp + "!");
                }
                break;

            case "2":
                if (water >= 350 && milk >= 75 && beans >= 20 && cups >= 1) {
                    water -= 350;
                    milk -= 75;
                    beans -= 20;
                    cups -= 1;
                    money += 7;
                    System.out.println("I have enough resources, making you a coffee!");
                } else {
                    if (water < 350) {
                        temp = "water";
                    } else if (milk < 75) {
                        temp = "milk";
                    } else if (beans < 20) {
                        temp = "beans";
                    } else if (cups < 1) {
                        temp = "cups";
                    }
                    System.out.println("Sorry, not enough " + temp + "!");
                }
                break;

            case "3":
                if (water >= 200 && milk >= 100 && beans >= 12 && cups >= 1) {
                    water -= 200;
                    milk -= 100;
                    beans -= 12;
                    cups -= 1;
                    money += 6;
                    System.out.println("I have enough resources, making you a coffee!");
                } else {
                    if (water < 200) {
                        temp = "water";
                    } else if (milk < 100) {
                        temp = "milk";
                    } else if (beans < 12) {
                        temp = "beans";
                    } else if (cups < 1) {
                        temp = "cups";
                    }
                    System.out.println("Sorry, not enough " + temp + "!");
                }
                break;

            case "back":
                break;

            default:
                System.out.println("Wrong option!");
        }
    }

    private static void fillOption(int water, int milk, int beans, int cups, int money) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("Write how many ml of water do you want to add: ");
        water = water + scanner.nextInt();
        System.out.println("Write how many ml of milk do you want to add: ");
        milk = milk + scanner.nextInt();
        System.out.println("Write how many grams of coffee beans do you want to add: ");
        beans = beans + scanner.nextInt();
        System.out.println("Write how many disposable cups of coffee do you want to add: ");
        cups = cups + scanner.nextInt();
    }

    private static void takeOption(int water, int milk, int beans, int cups, int money) {
        System.out.println("I gave you " + money);
        money = 0;
    }
}

【问题讨论】:

标签: java pass-by-value


【解决方案1】:

Java 总是按值传递。这里的问题是您正在使用隐藏静态成员的局部变量(在每个方法中声明的参数)。 您可以简单地省略方法声明中的所有参数:这样您将“使用”您在开始时声明的静态成员。

编辑

private static void takeOption(int water, int milk, int beans, int cups, int money) {
   //sample code
   milk = milk+1;
}

在这种情况下,您使用的每个操作,比如说,“牛奶”将只存在于这个方法中。你的参数被命名为 milk,但它与在你的类顶部声明的“milk”没有什么可共享的。它们的名字相同只是巧合。 您不能使用 this.milk (或 CoffeeMachine.milk,因为它是一个静态字段)来引用您的 static milk,但是由于您的代码是目前编写的,如果不进一步编辑您的方法,我认为没有用处。

private static void takeOption() {
   //code here
}

像这样编辑您的方法签名将使您使用静态变量。

【讨论】:

  • 作为旁注,这些字段可能不应该是 static :您代表的是您自己的 CoffeeMachine 的股票,而不是世界上每个 CoffeeMachine 共享的神奇股票。 (也就是说,这需要在您目前不这样做的某个时候实例化您的 CoffeeMachine,并且只要您只使用静态字段和方法操作单个 CoffeeMachine 可能会让初学者更简单)
  • 有很多可以改进的地方,但我想 OP 只是从 Java 开始。一次一步:)
【解决方案2】:

为了影响您为 CoffeeMachine 设置的静态变量。

你必须在你的方法中直接引用静态变量:

所以不要仅仅使用

water -= 250;

仅影响参数(本地范围)

你必须使用:

CoffeeMachine.water -= 250;

正如已经指出的那样,字段不应该是静态的,但我假设你现在正在学习 java。

注意: 出于您的目的,您的方法中可能不需要参数,因为您正在影响初始静态变量,但如果您确实需要参数:

您可以更改参数的名称:

private static void buyOption(int water, int milk, int beans, int cups, int money)

很容易变成:

private static void buyOption(int localWater, int localMilk, int localBeans, int localCups, int localMoney)

使用新名称,您可以只使用变量 water 来表示您的静态变量,同时使用 localWater 来表示您的参数

这样就可以了:

if (localWater >= 250 && localBeans >= 16 && localCups >= 1) {
                water -= 250;
                beans -= 16;
                cups -= 1;
                money += 4;
                System.out.println("I have enough resources, making you a coffee!");
            }

【讨论】:

    猜你喜欢
    • 2011-09-09
    • 1970-01-01
    • 2019-04-20
    • 1970-01-01
    • 2014-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多