通过枚举值调用函数

在做业务的时候,需要根据前端传递的不同枚举参数(比如说0,1)返回对应固定的值。但是这个值需要根据时间又有所变化。我们可以使用if-else去实现对应的逻辑,比如说,当前端传递参数为0是,需要返回当月一号到当前日期的号数。当传递的参数为1时,需要返回当前年份的1月到当前日期的月份。我们可以进行如下处理

public List<Integer> test(Integer type){
    if(type == 0){
        // 对应生成天数的代码
    }else if(type == 1){
        // 对应生成月份的代码
    }
    return ...;
}

 这是枚举值较少的时候,我们这么做也不是不能接受,但是当参数较多时,我们最好还是使用枚举来减少if-else的出现。因此,使用枚举类来处理时,上述代码可以化简为

@Getter
@AllArgsConstructor
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum DateTypeEnum {
    /**
     * 生成 00:00 至 当前时间最近15分钟的时间段集合
     */
    DAY(1, () -> {
        LocalTime current = LocalTime.now().truncatedTo(ChronoUnit.MINUTES);
        LocalTime startTime = LocalTime.MIDNIGHT;
        List<String> intervals = new ArrayList<>();
        while (!startTime.isAfter(current)) {
            intervals.add(startTime.toString());
            startTime = startTime.plusMinutes(15);
        }
        return intervals;
    }),
    /**
     * 生成当前月份1号至当前日期的时间段集合
     */
    MONTH(2, () -> {
        int dayOfMonth = LocalDate.now().getDayOfMonth();
        List<String> days = new ArrayList<>();
        for (int i = 1; i <= dayOfMonth; i++) {
            days.add(String.valueOf(i));
        }
        return days;
    }),
    /**
     * 生成当年1月份至当前月份的时间段集合
     */
    YEAR(3, () -> {
        LocalDate current = LocalDate.now();
        int currentMonth = current.getMonthValue();
        List<String> dateList = new ArrayList<>();
        for (int i = 1; i <= currentMonth; i++) {
            dateList.add(Month.of(i).getDisplayName(TextStyle.FULL, Locale.CHINA));
        }
        return dateList;
    });
    private Integer code;
    private Supplier<List> desc;
    public static final List<DateTypeEnum> LIST =
            Arrays.stream(values()).toList();
    public static final Map<Integer, DateTypeEnum> MAP = LIST.stream()
            .collect(Collectors.toMap(DateTypeEnum::getCode, f -> f));

    public static DateTypeEnum ofCode(Integer code) {
        return MAP.get(code);
    }
}

<think> 我们需要讨论枚举类型如何在函数参数中调用枚举(enum)是一种用户定义的类型,用于将一组命名的整数常量赋予一个类型。在函数参数中使用枚举,可以限制传入的值只能是枚举中定义的常量,提高代码的可读性和安全性。 ### 枚举函数入参中的调用方法: 1. **定义枚举类型**:首先需要定义一个枚举类型,例如: ```c typedef enum { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } Weekday; ``` 2. **函数声明中使用枚举类型**:在函数的参数列表中,使用枚举类型作为参数类型。例如: ```c void printDay(Weekday day) { switch(day) { case MONDAY: printf("Monday\n"); break; // 其他情况... default: printf("Invalid day\n"); } } ``` 3. **调用函数时传入枚举常量**:调用函数时,可以传入枚举中定义的常量值。例如: ```c printDay(MONDAY); // 正确 printDay(0); // 也可以,因为枚举常量实际上是整数,但建议使用枚举名 ``` 4. **注意事项**: - 虽然枚举值在底层是整数,但是使用枚举类型作为参数可以增加代码的可读性,并且编译器可能会进行类型检查(尽管C语言中枚举类型并不严格,它允许整数隐式转换为枚举类型)。 - 在C++中,枚举类型检查更严格,如果使用枚举类(enum class),则不能隐式转换为整数。 ### 示例代码: ```c #include <stdio.h> // 定义枚举 typedef enum { RED, GREEN, BLUE } Color; // 函数参数使用枚举类型 void printColor(Color color) { switch(color) { case RED: printf("Red\n"); break; case GREEN: printf("Green\n"); break; case BLUE: printf("Blue\n"); break; default: printf("Unknown color\n"); } } int main() { printColor(RED); // 输出: Red printColor(GREEN); // 输出: Green return 0; } ``` ### 总结: 在函数参数中使用枚举类型,只需要将枚举类型名作为参数类型,调用时传入该枚举类型的常量即可。这样可以使代码更清晰,并减少错误。 §§相关问题§§ 1. 在C语言中,枚举类型和整数类型在函数参数传递中有何区别?编译器如何处理? 2. 如果函数需要一个枚举类型的参数,但是传入了一个不在枚举范围内的整数,会发生什么? 3. 在C++中,枚举类(enum class)与普通枚举(enum)在作为函数参数时有何不同? 4. 如何设计枚举类型以提高函数参数的可扩展性和可维护性? 5. 在跨平台或嵌入式系统中使用枚举作为函数参数时,需要注意哪些问题? </think> ### 枚举函数入参中的调用方法 在C/C++中,枚举作为函数参数使用时需要注意以下要点: 1. **枚举类型的定义** 需先定义枚举类型,再声明函数参数: ```c // 定义枚举 typedef enum { STATE_IDLE, STATE_RUNNING, STATE_ERROR } SystemState; // 函数声明使用枚举参数 void handleState(SystemState current); ``` 2. **参数传递方式** - 值传递(默认方式): ```c void processEvent(EventType event); // 直接使用枚举类型 ``` - 指针传递(需修改枚举值时): ```c void updateStatus(StatusEnum* status); ``` - 常量引用(C++推荐方式): ```cpp void logState(const SystemState& state); ``` 3. **实际调用示例** ```c // 定义枚举 enum Color { RED, GREEN, BLUE }; // 声明函数 void setLedColor(Color c); int main() { setLedColor(RED); // 直接使用枚举值 setLedColor(GREEN); // setLedColor(10); // 错误:类型不匹配 return 0; } ``` 4. **关键注意事项** - **类型安全**:枚举提供强类型检查,防止传递无效整数值 - **可读性**:比直接使用整型参数更清晰 - **作用域**: - C中枚举值全局可见 - C++11起可使用`enum class`限定作用域: ```cpp enum class Mode { ON, OFF }; void setDevice(Mode m); setDevice(Mode::ON); // 需带作用域 ``` - **整型转换**:必要时可使用`static_cast<int>()`显式转换
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zmbwcx2003

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值