找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

5254

积分

0

好友

728

主题
发表于 2 小时前 | 查看: 4| 回复: 0

惊讶表情包

在日常编码中,给类取个好名字是门大学问。能否快速理解开源项目的代码结构和意图,同样是程序员的必备技能。那么,这些命名背后有没有规律可循呢?

Java项目的代码结构通常反映了其设计哲学。通过较长的、自解释的类名,配合高级IDE的智能提示,能够有效降低开发者的记忆负担,只需模糊匹配就能快速定位所需资源。

为了帮助大家更好地掌握命名的套路,我参考了主流的Java开源项目(如Spring系列、Netty、Guava、Logback等),梳理出10类常见的类命名后缀。它们大多以后缀形式出现,也常被组合使用以表达多重含义。

类命名思维导图

这些单词看似简单,却能立刻让你的代码看起来更清爽、更专业。接下来,我们就一起系统性地梳理一遍。为了方便理解,每种类型都附上了相应的示例。

管理类命名

编写代码总少不了对统一资源的管理,清晰的启动过程是有效组织代码的关键。为了让程序顺利运行,少不了各种资源的注册、调度,也离不开公共集合的管理。

Bootstrap,Starter

通常作为程序的启动器,或者作为启动器的基类。简单来说,可以看作是 main 函数的入口。

AbstractBootstrap
ServerBootstrap
MacosXApplicationStarter
DNSTaskStarter

Processor

某一类功能的处理器,用于表示一个处理过程,是一系列代码片段的集合。当你不知道如何为一些顺序执行的代码命名时,用它准没错,显得专业。

CompoundProcessor
BinaryComparisonProcessor
DefaultDefaultValueProcessor

Manager

管理具有生命状态的对象,通常作为某一类资源的管理入口。

AccountManager
DevicePolicyManager
TransactionManager

Holder

表示持有某个或某类对象的引用,并可对其进行统一管理。常见于需要统一处理的内存回收,或一些全局集合容器的缓存。

QueryHolder
InstructionHolder
ViewHolder

Factory

毫无疑问,这是工厂模式的标准命名,大家耳熟能详。尤其是在Spring框架中,比比皆是。

SessionFactory
ScriptEngineFactory
LiveCaptureFactory

Provider

Provider = Strategy + Factory Method。它更高级一些,将策略模式和方法工厂融为一体,用起来非常顺手。Provider通常是接口或抽象类,以便子类实现。

AccountFeatureProvider
ApplicationFeatureProviderImpl
CollatorProvider

Registrar

用于注册并管理一系列资源。

ImportServiceRegistrar
IKryoRegistrar
PipelineOptionsRegistrar

Engine

一般是核心模块,用来处理一类特定功能。引擎是个非常高级的词汇,普通的类可没资格用它。

ScriptEngine
DataQLScriptEngine
C2DEngine

Service

表示某个服务。概念太广,简单到不忍举例。注意不要滥用。

IntegratorServiceImpl
ISelectionService
PersistenceService

Task

表示某个任务。通常是一个 Runnable

WorkflowTask
FutureTask
ForkJoinTask

传播类命名

为了实现一些统计或全局功能,某些参数需要被一直传递下去。传播类对象通过统一封装的方式进行传递,并在适当的时机进行拷贝或更新。

Context

如果你的程序执行过程中,有一些变量需要从函数入口开始,一直传递到大量子函数执行完毕。如果将这些变量作为参数逐个传递,代码会变得无比冗长。此时,你可以将变量统一放入 Context 中,以单个对象的形式传递。

Java 中,由于 ThreadLocal 的存在,Context 甚至无需在参数间显式传递。

AppContext
ServletContext
ApplicationContext

Propagator

传播器。用于对 Context 中传递的值进行复制、添加、清除、重置、检索、恢复等操作。通常,它会提供一个名为 propagate 的方法来实现真正的变量管理。

TextMapPropagator
FilePropagator
TransactionPropagator

回调类命名

使用多线程提升程序效率时,不可避免地会引入异步化。我们需要一些手段来获取异步任务的执行结果,或对任务执行的关键节点进行监控。回调类API通过监听、通知等形式来捕获这些事件。

Handler,Callback,Trigger,Listener

Callback 通常是一个接口,用于响应某类消息并进行后续处理;Handler 通常表示持有真正消息处理逻辑的对象,它是有状态的;Trigger(触发器)代表对某类事件的处理,属于 Handler 的一种,但通常不会直接出现在类名中;Listener 的应用场景更具体,通常在观察者模式中表示特定的监听器。

ChannelHandler
SuccessCallback
CronTrigger
EventListener

Aware

意为“感知”。一般以该单词结尾的类,都实现了 Aware 接口。以Spring为例,Aware 的目的是让Bean能够获取Spring容器的服务。具体的回调方法由子类实现,比如 ApplicationContextAware。它带有一些回调的意味。

ApplicationContextAware
ApplicationStartupAware
ApplicationEventPublisherAware

监控类命名

现代程序越来越复杂,运行状态监控已成为必备品。监控数据的收集往往需要侵入到代码的各个角落,如何有效地将其与业务逻辑区分开,就显得非常重要。

Metric

表示监控数据。别再使用 Monitor 了,不够优雅。

TimelineMetric
HistogramMetric
Metric

Estimator

估计器、统计器。用于计算某一类统计数值。

ConditionalDensityEstimator
FixedFrameRateEstimator
NestableLoadProfileEstimator

Accumulator

累加器。用于缓存累加计算的中间结果,并提供读取这些结果的通道。

AbstractAccumulator
StatsAccumulator
TopFrequencyAccumulator

Tracker

一般用于记录日志或监控值,常用于APM(应用性能管理)中。

VelocityTracker
RocketTracker
MediaTracker

内存管理类命名

如果你的应用使用了自定义的内存管理机制,那么下面这些名词是绕不开的。比如 Netty,就实现了自己的内存管理。

Allocator

与存储相关,通常表示内存分配器或管理器。当你的程序需要申请有规律的大块内存时,Allocator 是不二之选。

AbstractByteBufAllocator
ArrayAllocator
RecyclingIntBlockAllocator

Chunk

表示一块内存。如果你需要对一类存储资源进行抽象并统一管理,可以使用它。

EncryptedChunk
ChunkFactory
MultiChunk

Arena

英文意为舞台、竞技场。由于Linux在内存管理上将其发扬光大,它被广泛用于各种存储资源的申请、释放与管理。为不同规格的存储块(Chunk)提供舞台,这个比喻非常形象。

关键是,这个词很美,作为后缀能让类名显得很漂亮。

BookingArena
StandaloneArena
PoolArena

Pool

表示池子。内存池、线程池、连接池,处处可用。

ConnectionPool
ObjectPool
MemoryPool

过滤检测类命名

程序接收的事件和信息非常多,有些是合法的,有些则需要过滤丢弃。根据不同的使用范围和功能差异,过滤操作也有多种形式。你会在框架类代码中发现大量这样的名词。

Pipeline,Chain

通常用于责任链模式。在Netty、Spring MVC、Tomcat等框架中大量应用。通过将某个处理过程加入到责任链的特定位置,就可以接收前面处理的结果,强制添加或改变某些功能。就像Linux的管道操作一样,最终构造出想要的结果。

Pipeline
ChildPipeline
DefaultResourceTransformerChain
FilterChain

Filter

过滤器,用于筛选出满足条件的数据集,或在满足某些条件时执行一部分逻辑。如果与责任链结合,通常能实现多级过滤。

FilenameFilter
AfterFirstEventTimeFilter
ScanFilter

Interceptor

拦截器,其实和 Filter 功能相似。不过在Tomcat中,Interceptor 可以获取到 controller 对象,而 Filter 不行。拦截器通常被包裹在过滤器之中。

HttpRequestInterceptor

Evaluator

英文意为评估器。可用于判断某些条件是否成立,其内部方法 evaluate 通常返回布尔类型。例如,传入一个复杂的对象或字符串,判断其是否正确。

ScriptEvaluator
SubtractionExpressionEvaluator
StreamEvaluator

Detector

探测器。用于管理一系列探测性事件,并在事件发生时进行捕获和响应。比如Android中的手势检测、温度检测等。

FileHandlerReloadingDetector
TransformGestureDetector 
ScaleGestureDetector

结构类命名

除了基本的数据结构(如数组、链表、队列、栈),其他更高层次的常见抽象类,能极大减少沟通成本,并封装常见的变化。

Cache

这个无需多说,就是缓存。大块数据的缓存。常见的缓存算法有LRU、LFU、FIFO等。

LoadingCache
EhCacheCache

Buffer

缓冲区,不同于缓存,它一般用在数据写入阶段。

ByteBuffer
RingBuffer
DirectByteBuffer

Composite

将相似的组件进行组合,并以相同的接口或功能对外暴露,使用者无需关心这到底是一个组合体还是单个个体。

CompositeData
CompositeMap
ScrolledComposite

Wrapper

包装器,用于包装某个对象,添加或移除某些额外功能。

IsoBufferWrapper
ResponseWrapper
MavenWrapperDownloader 

Option, Param, Attribute

用于表示配置信息。说实话,它和 Properties 区别不大,但由于 Option 通常是一个类,因此功能可以扩展得更强大。它通常比 Config 的级别更细,关注的是单个属性的值。Param 一般作为参数存在,对象的生成速度更快。

SpecificationOption
SelectOption
AlarmParam
ModelParam

Tuple

元组的概念。由于Java语言本身缺乏元组结构,我们通常会自定义这样的类。

Tuple2
Tuple3

Aggregator

聚合器,可以执行一些聚合计算。比如在分库分表场景中,对sum、max、min等聚合函数的结果进行汇集。

BigDecimalMaxAggregator
PipelineAggregator
TotalAggregator

Iterator

迭代器。可以实现Java的 Iterator 接口,也可以有自己的迭代方式。在数据集很大、需要深度遍历时,迭代器几乎是必备的。使用迭代器还可以在遍历过程中安全地删除某些元素。

BreakIterator
StringCharacterIterator

Batch

表示可批量执行的请求或对象。

SavedObjectBatch
BatchRequest

Limiter

限流器,使用漏桶算法或令牌桶算法来实现平滑的流量限制。

DefaultTimepointLimiter
RateLimiter
TimeBasedLimiter

常见设计模式命名

设计模式是命名中的“重灾区”,这里仅列出最常使用的几个。

Strategy

策略模式:定义一系列算法,将每个算法封装起来,并使它们可以相互替换。相同的接口,不同的实现类,同一方法因策略不同而产生不同结果。例如,一个配置文件,无论是放在XML还是JSON中,都可以使用不同的 Provider 来命名。

RemoteAddressStrategy
StrategyRegistration
AppStrategy

Adapter

适配器模式:将一个类的接口转换成客户期望的另一个接口,使原本因接口不兼容而无法一起工作的类可以协同工作。

不过,除了传统的API适配,如果你的某个 Handler 接口方法特别多,可以使用 Adapter 实现一些默认方法(空实现)。这样,其他类在使用时只需继承这个 Adapter,然后重写需要的方法即可。这也是 Adapter 的常见用法。

ExtendedPropertiesAdapter
ArrayObjectAdapter
CardGridCursorAdapter

Action,Command

命令模式:将一个请求封装为一个对象,从而允许你用不同的请求对客户进行参数化,支持请求排队、记录日志以及可撤销的操作。

用于表示一系列动作指令。Action 一般用在UI操作上,而后端框架则可以无差别地使用。

在DDD(领域驱动设计)的概念中,CQRS的Command的“C”,即为 Command

DeleteAction
BoardCommand

Event

表示一系列事件。通常在语义上,ActionCommand 等来自于主动触发;而 Event 则来自于被动触发。

ObservesProtectedEvent
KeyEvent

Delegate

代理模式或委托模式。委托模式是将一件属于委托者的事情,交给另一个被委托者来处理。

LayoutlibDelegate
FragmentDelegate

Builder

建造者模式的标准命名。将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。比如 StringBuilder(当然,StringBuffer 是个特例,这也说明了规则是人定的,人也可以打破)。

JsonBuilder
RequestBuilder

Template

模板方法模式:定义一个操作中的算法骨架,而将一些步骤延迟到子类中。使得子类可以不改变算法结构即可重定义该算法的某些特定步骤。

JDBCTemplate

Proxy

代理模式:为其他对象提供一种代理以控制对这个对象的访问。

ProxyFactory 
SlowQueryProxy

解析类命名

编写代码会涉及大量的字符串解析、日期解析、对象转换等。根据语义和使用场合的不同,它们也有多种分类。

Converter,Resolver

转换器和解析器。一般用于不同对象之间的格式转换,把一类对象转换成另一类。注意它们语义上的细微差别:通常,对于特别复杂的转换或有加载过程的需求,可以使用 Resolver

DataSetToListConverter
LayoutCommandLineConverter
InitRefResolver
MustacheViewResolver

Parser

用来表示非常复杂的解析器,比如用于解析DSL(领域特定语言)。

SQLParser
JSONParser

Customizer

自定义器。用于表示对某个对象进行特殊的配置。由于这些配置过程可能特别复杂,值得单独提取出来进行自定义设置。

ContextCustomizer
DeviceFieldCustomizer

Formatter

格式化类。主要用于字符串、数字或日期的格式化处理。

DateFormatter
StringFormatter

网络类命名

网络编程的同学,永远绕不开下面几个名词。

Packet

通常用于网络编程中的数据包。

DhcpPacket
PacketBuffer

Protocol

同样用于网络编程中,表示某个协议。

RedisProtocol
HttpProtocol

Encoder、Decoder、Codec

编码器、解码器、编解码器。

RedisEncoder
RedisDecoder
RedisCodec

Request,Response

一般用于网络请求的“进”和“出”。如果你将它们用在非网络请求的方法上,会显得很怪异。

CRUD命名

这部分就有意思多了。统一的Controller、Service、Repository,没什么好说的。但一旦你采用了DDD(领域驱动设计),就需要遵循DDD那一套命名规则。

由于DDD不属于通用编程范畴,其专有名词在此就不多做介绍了。

其他

Util,Helper

都表示工具类。Util 通常是无状态的(静态方法),而 Helper 可能需要创建实例才能使用。但一般没有用 Tool 作为后缀的。

HttpUtil
TestKeyFieldHelper
CreationHelper

Mode,Type

看到 Mode 这个后缀,就能猜到这个类大概率是个枚举。它通常会把所有常见的可能性都列出来,供其他地方引用。

OperationMode
BridgeMode
ActionType

Invoker,Invocation

Invoker 是一类接口,通常会以反射或触发的方式执行一些具体的业务逻辑。通过抽象出 invoke 方法,可以在调用前对入参进行记录或处理,在调用后对结果和异常进行处理,这是AOP编程中的常见操作。

MethodInvoker
Invoker
ConstructorInvocation

Initializer

如果你的应用程序需要经过大量初始化操作才能启动,那么就有必要将这些操作独立出来,专门处理初始化动作。

MultiBackgroundInitialize
ApplicationContextInitializer

Future,Promise

它们都用于多线程间的数据传递。

Future 相当于一个占位符,代表一个操作将来的结果。一般通过 get 方法阻塞获取结果,或者让其异步执行并通过回调(callback)获取结果。

但如果回调中又嵌套了回调呢?如果层次太深,就会形成“回调地狱”。Java中的 CompletableFuture 其实就是 Promise,用来解决回调地狱问题。Promise 是为了让异步代码变得优美而存在的。

Selector

根据一系列条件,获取相应的同类资源。它有点像 Factory,但通常只处理单项资源的选择。

X509CertSelector
NodeSelector

Reporter

用于汇报某些执行结果。

ExtentHtmlReporter
MetricReporter

Constants

一般用于常量列表。

Accessor

封装了一系列get和set方法的类。像Lombok就有 @Accessors 注解来生成这些方法。但 Accessor 类通常要通过计算来完成get和set操作,而不是直接操作变量。这适用于比较复杂的对象存取服务。

ComponentAccessor
StompHeaderAccessor

Generator

生成器,一般用于生成代码、生成ID等。

CodeGenerator
CipherKeyGenerator

结束语

编写和阅读代码,怎么能少得了对命名之道的“意会”呢?代码要有感觉,命名也需风骚。名字起得好,代码看起来就爽,大家也都喜欢。

有时候说不清的道理,给一段代码,咱就能懂!就是这么神奇!

其实,编写专业、优秀的代码,并不需要掌握太多的英文单词,大多数时候用不着英语四级那么高的水平。只需要有限的词汇量,就能在代码世界里玩出高级感。

本文梳理的这些命名,高频出现在各种主流框架中。如果你真正理解了这些名词,阅读大部分源代码可以说基本没有障碍了。在相同的上下文中,优先使用这些名词,已经是开发者社区心照不宣的规范。

很多名词源于 设计模式 ,又在特定场景下使用了更贴切的单词(比如 Provider),大家仔细体会其中的区别即可。

命名是编码中极为重要的一环,希望大家能掌握其中的规律,让你编写的代码既功能强大,又颜值在线。优秀的命名习惯是专业精神和工匠精神的体现,也期待在像 云栈社区 这样的技术交流平台上,看到更多关于代码艺术与实践的精彩讨论。




上一篇:Java 26原生支持UUIDv7,告别随机ID的索引性能困扰
下一篇:IETF IPv8草案解读:兼容IPv4的下一代网络协议,如何规划网络演进?
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-4-20 09:08 , Processed in 1.184348 second(s), 41 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表