Java 中使用枚举的正确姿势

在项目开发中我们经常用到枚举定义常量,例如定义系统中用户的身份类型(ADMIN、USER…)、定义项目启动环境的类型(DEV,PROD…)、某个字段的值的枚举等。往往我们发现在项目里定义枚举类时只是有枚举成员,像下面这样:

1public enum Type {
2  T1,T2,T3
3}

不能说这样不好,只是这样差不多又回到了我们使用类定义静态常量常量。Java 中除了有类(class)这种类型,又实现了枚举(enum)这种类型,说明肯定它独特的用处,不妨我们先回忆下使用类成员定义静态常量和枚举定义常量的区别。

  • 使用类的静态成员定义常量,常量只能有一个固定的值,通常是一个简单的字符串或一个数值。
  • 使用枚举定义常量,实例化枚举后不可变,枚举可以携带多个值,这为常量提供了更多信息。(补充,虽说枚举实例化后不可变,但它的成员变量如果不用 final 修饰,是可变的!)
  • 如果你熟悉枚举的原理,你可以通过类(class)模拟出一个枚举(enum),但通常你需要两个类来完成这个工作,一个类来定义枚举和其成员,另一类完成初始化。而枚举(enum)通过编译消除了这些复杂性,可以轻松实例化对象和定义方法。

通过它们之间的区别,可以看出枚举能为我们的常量提供更多的信息和更加便捷的定义、实例化。那么如何利用好枚举这些特性,如何定义好用(便捷)的枚举呢?

2022 年总结:积极生活每一天

不平凡的一年过去了,生活是个五味调料罐,喜怒哀里交加,平凡的生活中偶尔跳出点惊喜。

今年终于看到疫结束的希望了,距离 2019 年年底发现新冠整整三年了,无数学生感叹“大学有几年,疫情占三年”,我印象最深刻的是大学的网课,老师们猝不及防地适应直播教学,学生们不再去教室上课了,还有各个地方的管控,以至于过年、假期回不来家以及线上办公。疫情期间这段记忆对国人真的是太深刻了,以至于听到放开的消息,心情激动就像在工作日无缘无辜给放了个假似的,以后可以大胆和朋友聚餐,愉快地出去旅游了。

“最近发展区” 理论

最近发展区理论 是教育学上的一个概念,它把人理解事物的等级做了区分,使教育者可以使用这个理论评估学生和教学内容,以达到最优的教学效率。最近发展区理论具备一定的普适性,也可以用在日常沟通、会议、汇报、分享等场景中,作为评估用户的方法。

根据 “最近发展区” 理论,可以人把当前具备的知识划分为三个级别:知识舒适区、最近发展区、知识困难区。

  • 知识舒适区:人已有的知识,理解应用这些知识自然且没有压力
  • 最近发展区:人可以根据已有的知识可能达到的知识,通常需要借助外力达到;
  • 知识困难区:知识超过了人能理解的范围,理解应用这些知识困难

如果把我们日常场景分成两类:沟通交流(会议、汇报)、分享教学(分享、讲课),那么:

  • 在沟通交流的活动中,应该尽量在双方的知识舒适区进行交谈、讨论,避免出现知识困难区的词汇、概念;

  • 在分享教学活动中,最应该关注的是受众群体的最近发展区,最近发展区的知识能有利地让受众成长和受到启发。知识的掌握是一个循序渐进的过程,知识的准备需要遵循这样的逻辑与原理,在准备时首先要找到受众群体的上限和下限(受众群体存在差异时要找重叠区),在组织材料时通常由下限逐渐延伸至上限。

数据优先级

今天上午和前端同学开周会,我捕获到了一个字眼 —— “数据优先级”,这让我想到了我工作中处理任务的优先级,如果把程序想象成一个具备独立思维的个体,它想更好的处理业务也是需要考虑这些的。

在工作中,同时处理多个工作有时让人头大,从一件事转向另一件事,脑海里必然要切换事情的上下文,有时话费的时间甚至比做这件事还多,这种情况对应到程序中自然是操作系统调度线程切换上下文的开销,我们不能忽略,程序也是。还有数据竞争、锁机制等,都能找到和生活中对应的,如果把我们现实中的最佳实践应用在程序肯定会提升程序设计能力。

用 Java 实现生成 Markdown 文本的工具

公司的 IM 每天有许多机器人推送的消息,我也在使用,这个功能是好的,但是当我们想去发送一些格式优美的消息时,却要费许多功夫,主要来源于字符串拼接,如果要拼接出 Markdown 格式的那就更费力了,另外由拼接带来的是混乱的代码,为了解决这个痛点,我写了一个 Java 代码生成 Markdown 文本的工具,还给它起了一个酷酷的名字 MdKiller。

MdKiller —— Markdown 杀手。

MdKiller 可以格式化生成 Markdown 文本的工具,支持常用 Markdown 格式生成,例如引用块、代码块、有无序列表、表格等,内容上支持字体样式(style)和内容的嵌套,适用于 IM 消息 Markdown 排版。

Rust语言笔记

image

本文不讨论是否选择 Rust,只做 Rust 介绍以及它最新动态的陈述,另外一些资料我会列在文末。

系统级开发语言一直是 C/C++ 的代名词,C 语言偏低层缺少类似 C++ 标准模版库这样的利器,虽然 C++ 开发效率高,但是复杂很难精通,而 Rust 语言同时兼顾了 C 和 C++,即有低层控制硬件的能力又有高级语言的语法特性,例如面向对象、范型等。

Rust 是一门静态语言,其源文件编译后可以不依赖 SDK 运行;Rust 具有安全的内存管理并且没有 GC,对于系统级别软件(文件系统、系统内核、驱动…)是不允许存在 Stop The World(俚语,暂停整个程序)的,对于内存管理的苦楚恐怕只有 C/C++ 程序员最清楚,常常引发问题的就是这块,Rust 以其独有的方法在编译前就解决了这块,相当于拥有了自动内存管理。

在 Linux 上排查日志的技巧

业务中避不开的就是在解决 bug 的过程中查看业务系统的日志,经常会面临大日志文件,还有日志文件检索问题,这篇文章介绍使用 tail less grep 命令排查日志使用技巧。

之前写过的 Linux 命令、Shell 相关教程,可以帮助了解这篇文章用到的命令。

毕业后相聚

三月软件 2022 届毕业生聚会,等这一天等了许久了,一提起就说“忙”、“有工作还需要加班”,今天可算抽出空来。

我们组织了两个活动:聚餐和泡温泉。

泡温泉是愉快的,的地方有许多不同样式的休息区,我们泡完在里面歇息了一会,享受了短暂的自由与快乐时光;吃饭是尽兴的,湘菜有些辣,无形地让聊天的话题变得炙热起来,等菜品吃的差不多看大家还意犹未尽,又点了几个菜,名曰“续杯”,伴随夕阳一起落下,天渐渐黑,最后心满意足了。

Linux|手动安装 MySQL 教程

使用手动方式安装 MySQL,手动配置 MySQL,使用 systemd 托管 MySQL 启动。

香山公园

香山公园游览 @JT、@HZY、@JXH。

《古树》
《古树》