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

Java枚举构造器未定义问题:咖啡工厂枚举代码技术咨询

排查并解决Java枚举构造器未定义问题

首先,我先把你提供的代码格式化并修正明显的截断/转义问题,方便分析:

import java.util.ArrayList;

public class CoffeeFactory {
    public static enum Type {
        LONG_BLACK(4.0), FLAT_WHITE(4.75), MOCHA(5.5);
        private double price;

        Type(double price) {
            this.price = price;
        }

        public double getPrice() {
            return price;
        }
    }

    public static enum Ingredient {
        ESPRESSO(0.5), MILK(1), CHOCOLATE(1.5);
        private double cost;

        Ingredient(double cost) {
            this.cost = cost;
        }

        public double getCost() {
            return cost;
        }
    }

    public static Coffee CreateCoffee(Type type){
        // 这里代码截断了,应该是 ArrayList<Ingredient> 而非 ArrayList&lt;Ingredie
        ArrayList<Ingredient> ingredients = new ArrayList<>();
        // 后续逻辑未完成
    }
}

可能导致“枚举构造器未定义”的原因及解决方案

  1. 代码截断/拼写错误
    你提供的CreateCoffee方法代码不完整,ArrayList&lt;Ingredie是HTML转义错误+拼写截断,正确写法是ArrayList<Ingredient>。如果编译器无法识别Ingredient类型,可能会误报构造器未定义——先把这部分修正,补全方法体。

  2. 尝试手动实例化枚举
    Java的枚举是特殊的类,绝对不能通过new关键字创建实例(比如new Type(5.0)或者new Ingredient(1.2)都是不允许的)。枚举实例只能使用你预定义的常量,比如Type.LONG_BLACK、Ingredient.MILK。如果你的代码里有类似手动new枚举的操作,这就是报错的根源,直接替换成预定义常量即可。

  3. 枚举常量未传入构造器参数
    你的Type和Ingredient都定义了带参数的构造器,所有枚举常量必须传入对应类型的参数——这点你已经做对了(比如LONG_BLACK(4.0)),所以这部分没问题。但如果后续新增枚举常量时忘了传参数,就会触发构造器未定义的错误,记得新增时保持参数匹配。

补全后的完整示例代码

我帮你补全了CreateCoffee方法的逻辑,同时添加了Coffee类的基础定义,确保代码可以正常编译:

import java.util.ArrayList;
import java.util.List;

public class CoffeeFactory {
    public static enum Type {
        LONG_BLACK(4.0), FLAT_WHITE(4.75), MOCHA(5.5);
        private double price;

        Type(double price) {
            this.price = price;
        }

        public double getPrice() {
            return price;
        }
    }

    public static enum Ingredient {
        ESPRESSO(0.5), MILK(1), CHOCOLATE(1.5);
        private double cost;

        Ingredient(double cost) {
            this.cost = cost;
        }

        public double getCost() {
            return cost;
        }
    }

    public static Coffee CreateCoffee(Type type){
        List<Ingredient> ingredients = new ArrayList<>();
        
        // 根据咖啡类型添加对应配料
        switch (type) {
            case LONG_BLACK:
                ingredients.add(Ingredient.ESPRESSO);
                break;
            case FLAT_WHITE:
                ingredients.add(Ingredient.ESPRESSO);
                ingredients.add(Ingredient.MILK);
                break;
            case MOCHA:
                ingredients.add(Ingredient.ESPRESSO);
                ingredients.add(Ingredient.MILK);
                ingredients.add(Ingredient.CHOCOLATE);
                break;
            default:
                throw new IllegalArgumentException("未知咖啡类型: " + type);
        }

        return new Coffee(type, ingredients);
    }

    // 定义Coffee类(假设你之前没写)
    static class Coffee {
        private Type type;
        private List<Ingredient> ingredients;

        public Coffee(Type type, List<Ingredient> ingredients) {
            this.type = type;
            this.ingredients = ingredients;
        }

        // 可选:添加getter方法
        public Type getType() {
            return type;
        }

        public List<Ingredient> getIngredients() {
            return ingredients;
        }
    }
}

总结

先修正代码的截断和拼写问题,再检查是否存在手动实例化枚举的情况,这两个点是导致你遇到“构造器未定义”错误的最可能原因。按照上面的示例调整后,代码应该可以正常编译运行。

内容的提问来源于stack exchange,提问作者Sam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:24:35