我正在try 优化如下代码段:

public class Kvarteret {
    public static final String ONE_BEER = "hansa";
    public static final String ONE_CIDER = "grans";
    public static final String REAL_BEER = "vestkyst";
    public static final String GT = "gt";
    public static final String BACARDI_SPECIAL = "bacardi_special";

    public int calculatePrice(String drink, boolean student, int amount) {

        if (amount > 2 && (drink == GT || drink == BACARDI_SPECIAL)) {
            throw new RuntimeException("Too many drinks, max 2.");
        }

        int price;

        if (drink.equals(ONE_BEER)) { price = 74;}
        else if (drink.equals(ONE_CIDER)) { price = 103;}
        else if (drink.equals(REAL_BEER)) { price = 110; }
        else if (drink.equals(GT)) { price = ingredient6() + ingredient5() + ingredient4();}
        else if (drink.equals(BACARDI_SPECIAL)) {
            price = ingredient6()/2 + ingredient1() + ingredient2() + ingredient3();
        } else { throw new RuntimeException("Item not in menu"); }

        if (student && (drink == ONE_BEER || drink == ONE_CIDER || drink == REAL_BEER)) { price = price - price/10;}
        return price*amount;
    }

    //rom unit
    private int ingredient1() { return 65;}

    // grenadine unit
    private int ingredient2() { return 10;}

    //lime-juice unit
    private int ingredient3() { return 10;}

    //mint-leafs unit
    private int ingredient4() { return 10; }

    //tonic-water unit
    private int ingredient5() { return 20; }

    //gin unit
    private int ingredient6() { return 85; }
}

该代码是一个计算饮料价格的简单程序.我用this个代码作为起点,因为看起来我们正在try 做类似的事情.

到目前为止,我的代码如下所示:

import java.util.*;

public class Kvarteret2 {
    private static double price;
    private static double order;

    // Enums defines common values
    private enum Beer_Cider {
        BEER("Hansa", 74), CIDER("Grans", 103), REAL_BEER("Vestkyst", 110);

        private static String order;

        Beer_Cider(String order, double cost) {
            order = order;
            price = cost;
        }

        private static String getOrder() {return order;}
        private static double getCost() {return price;}
    }

    private enum DrinkIngredients {

        ROM("Rom", 65), GRENADINE("Grenadine", 10), LIME("Lime-juice", 10),
        MINT("Mint", 10), TONIC("Tonic-water", 20), GIN("Gin", 85);

        private static String ingredient;

        DrinkIngredients(String ingredient, double cost){
            ingredient = ingredient;
            price = cost;
        }

        private static String getIngredient() {return ingredient;}
        private static double getCost() {return price;}
    }

    // Dictionary with the drink as Key and a list of the ingredients and prices as value
    Map<String, List<DrinkIngredients>> Drinks = new HashMap<String, List<DrinkIngredients>>(); 

    public Kvarteret2() {
        Drinks.put("GT", [DrinkIngredients.GIN, DrinkIngredients.TONIC, DrinkIngredients.MINT]);

    }


    private static double calculate_price(String drink, boolean student, int amount){

        if (amount > 2) {
            throw new IllegalArgumentException("Too many drinks! You can order max 2 drinks at a time.");
        }

        double student_discount = 0.1;

        if (student){
            if (drink == "BEER" || drink == "CIDER" || drink == "REAL BEER") {
                price = amount * (price - price * student_discount);
            }
        }
        return price;
    }
}

由于以下代码,我收到一个错误:

public Kvarteret2() {
    Drinks.put("GT", [DrinkIngredients.GIN, DrinkIngredients.TONIC, DrinkIngredients.MINT]);

}

我正在try 向字典中添加元素,但我认为这不是正确的方法.

我知道我的代码可能还没有得到100%的优化,但我只是想看看我是否可以让这个解决方案发挥作用,然后再try 让它变得更好(因为很可能有更好的方法可以做到这一点).

如何使用枚举正确创建要创建的词典?

推荐答案

你的代码中有很多错误.

在Java(it doesn't work in the same way as in JavaScript)中创建list时使用的语法不正确:

[DrinkIngredients.GIN, DrinkIngredients.TONIC, DrinkIngredients.MINT] // <- that's not correct

List.of(DrinkIngredients.GIN, DrinkIngredients.TONIC, DrinkIngredients.MINT) // <- correct

必须与特定枚举常量关联的枚举字段不应标记为static.修饰符static表示一个字段在一个类的所有实例之间共享,一天结束时的enums是类.如果希望字符串order对于所有类型的饮料都是唯一的,则此行不正确:

private static String order;

构造函数中的另一个错误:

Beer_Cider(String order, double cost) {
    order = order;
    price = cost;
}

order = order;行将无法按预期工作.它不会指定对象属性,而只是将参数order重新指定给自身.您应该使用关键字this来引用对象字段顺序.

private enum BeerCider {
    BEER("Hansa", 74), CIDER("Grans", 103), REAL_BEER("Vestkyst", 110);
    
    private String order;
    private double cost;
    
    Beer_Cider(String order, double cost) {
        this.order = order;
        this.cost = cost;
    }
    
    private String getOrder() {return order;}
    private double getCost() {return cost;}
}

For more information of enums have a look at this tutorial

Sidenote:根据Java naming conventions,下划线应仅用于常量的名称(如unum成员、static final个字段),但enum的名称必须以驼峰式BeerCider书写,如类和接口的名称.

Java相关问答推荐

Java -使用空比较或instanceof?

Java SSLocket查明客户端是否发送了证书

当耗时的代码完成时,Circular ProgressIndicator显示得太晚

Mongo DB Bson和Java:在子文档中添加和返回仅存在于父文档中的字段?

Java .类参数不通过构造函数传递

Jlink选项&-strie-ative-Commands";的作用是什么?

滚动视图&不能在alert 对话框中工作(&Q;&Q;)

如何创建同一类的另一个对象,该对象位于变量中?

JPanel透支重叠的JComcoBox

使用GridBagLayout正确渲染

Kotlin内联互操作:强制装箱

匹配一组字符或另一组字符

在执行流和相关操作时,使用Java泛型为2个方法执行相同的操作,但对象不同

根本不显示JavaFX阿拉伯字母

如何在列表(链表)中插入一个新 node (作为prelast)

我如何为我的Java抵押贷款代码执行加薪操作(&Q)

RestTemplate Bean提供OkHttp3ClientHttpRequestFactory不支持Spring Boot 3中的请求正文缓冲

使用MediaPlayer类在一段时间后停止播放音乐

如何通过用户ID向用户发送私信

AspectJ编织外部依赖代码,重新打包jar并强制依赖用户使用它