稀土掘金技术社区 10月03日 09:51
枚举形参倒置:Java与TypeScript的实现方式
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文探讨了“枚举形参倒置”这一编程技巧,旨在通过为枚举形参添加方法,减少函数调用时传入的参数数量,从而使代码更简洁。文章详细介绍了在Java中如何通过封装枚举类并为其添加方法来实现这一功能,并提供了相应的代码示例。接着,文章转向TypeScript,指出由于TypeScript枚举的特性限制,需要借助类来实现类似的功能,并参考了“TypeScript使用枚举封装和装饰器优雅的定义字典”一文的设计,给出了TypeScript的实现方案和调用示例。最后,文章总结了通过类封装实现枚举功能及“枚举形参倒置”的通用方法。

💡 **枚举形参倒置的概念与目的**:该技术通过为枚举添加方法,允许直接调用枚举项的格式化方法,从而减少在函数调用时传递枚举类型作为参数的需求,使代码调用更简洁,例如从`DateTimeUtil.format(timestamp, DateTimeFormatter.FULL_DATE)`简化为`DateTimeFormatter.FULL_DATE.format(timestamp)`。

✅ **Java中的实现方式**:在Java中,枚举本身就是类的特殊封装。可以通过定义一个枚举类,为枚举项添加自定义方法(如`format`和`formatCurrent`),这些方法内部调用相应的工具类(如`DateTimeUtil`)来完成具体操作,从而实现枚举形参倒置。

💻 **TypeScript中的实现方式**:由于TypeScript的枚举不具备Java那样的封装特性,实现枚举形参倒置需要借助类。文章建议参考“TypeScript使用枚举封装和装饰器优雅的定义字典”的设计,创建一个继承自`AirEnum`的类,并将其枚举项定义为类的静态实例,再为这些实例添加所需的方法,实现类似Java的效果。

✨ **代码简洁性与可读性提升**:无论是Java还是TypeScript,通过实现枚举形参倒置,都能显著提升代码的简洁性和可读性,减少冗余参数的传递,使代码逻辑更加直观,易于理解和维护。

原创 Hamm 2025-10-03 09:01 重庆

点击关注公众号,技术干货及时达!

一、前言首先,「枚举形参倒置」 的意思是通过为枚举形参添加一些方法,来减少调用时候传入的形参个数。

「🌰举个栗子」

long timestamp = System.currentTimeMillis();// beforeDateTimeUtil.format(timestamp, DateTimeFormatter.FULL_DATE);// afterDateTimeFormatter.FULL_DATE.format(timestamp);
如上示例代码,我们可以在调用时候减少传入一个枚举形参的传入,写出来的代码会更加简洁好看。

还有其他好处吗?

好像没有了...

当然,我们不讨论这两种写法的好处和坏处 「(评论区可以讨论)」 ,我们只聊实现。

二、Java 的实现众所周知,在 「Java」 中,枚举本身也是类的特殊封装,而枚举项可以认为是 「Java」 类的静态实例常量,所以,我们很轻易的就能实现:

2.1 封装枚举类
@Getter@AllArgsConstructorpublicenum DateTimeFormatter {    /**     * 年月日     */    FULL_DATE("yyyy-MM-dd"),    /**     * 时分秒     */    FULL_TIME("HH:mm:ss"),    /**     * 年月日时分秒     */    FULL_DATETIME("yyyy-MM-dd HH:mm:ss"),    ;    privatefinal String value;}
如上,我们声明这个枚举类之后,就可以为这个枚举添加一些我们需要的方法了:

2.2 添加方法
@Getter@AllArgsConstructorpublicenum DateTimeFormatter {    // 省略定义的枚举项目    ;    // 枚举项封装的值    privatefinal String value;    /**     * 使用这个模板格式化毫秒时间戳     *     * @param milliSecond 毫秒时间戳     * @return 格式化后的字符串     */    publicfinal@NotNullString format(long milliSecond) {        return DateTimeUtil.format(milliSecond, this);    }    /**     * 使用这个模板格式化当前时间     *     * @return 格式化后的字符串     */    publicfinal@NotNullString formatCurrent() {        return format(System.currentTimeMillis());    }}
2.3 调用示例所以封装完毕之后,我们就可以用这两个方法来实现本文提到的 「枚举形参倒置」 了:

三、TypeScript 的实现可是在 「TypeScript」 中,「枚举」 并没有像 「Java」 那样,有 「枚举封装」 的特性,所以,我们只能通过 「类」 来实现这个功能了。可以参考我们这篇文章:TypeScript使用枚举封装和装饰器优雅的定义字典。今天我们就不赘述之前的设计了,可以先阅读之后继续下面的内容。

3.1 封装枚举类
export class DateTimeFormatter extends AirEnum {  static readonly FULL_DATETIME = new DateTimeFormatter(    'yyyy-MM-dd HH:mm:ss''年-月-日 时:分:秒'  )  static readonly FULL_DATE = new DateTimeFormatter(    'yyyy-MM-dd''年-月-日'  )  static readonly FULL_TIME = new DateTimeFormatter(    'HH:mm:ss''时-分-秒'  )}
我们的枚举就声明好了,当然这里的 「例子🌰」 其实是多余的,因为 「DateTimeFormatter」 这种几乎好像大概应该也许是没有什么符合字典业务场景的。

当然,为了举例,你就假设它有。

3.2 添加方法接下来,我们也同样实现这两个方法:

export class DateTimeFormatter extends AirEnum<string> {// 一些静态枚举项目/**   * 格式化毫秒时间戳   * @param timestamp 毫秒时间戳   */  format(timestamp: number) {    return AirDateTime.formatFromMilliSecond(timestamp)  }/**   * 格式化当前时间   */  formatCurrent() {    returnthis.format(Date.now().valueOf())  }}
如上,我们实现了和 「Java」 一样的方法,然后就可以在调用的时候使用这个方法了:

3.3 调用示例四、总结本文通过类的封装,来实现了枚举功能以及 「枚举形参倒置」 的功能。

AI编程资讯AI Coding专区指南:

https://aicoding.juejin.cn/aicoding

""~

阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

枚举 形参倒置 Java TypeScript 编程技巧 代码优化 Enum Parameter Inversion Java TypeScript Programming Techniques Code Optimization
相关文章