
在日常编码中,给类取个好名字是门大学问。能否快速理解开源项目的代码结构和意图,同样是程序员的必备技能。那么,这些命名背后有没有规律可循呢?
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
表示一系列事件。通常在语义上,Action、Command 等来自于主动触发;而 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
格式化类。主要用于字符串、数字或日期的格式化处理。
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),大家仔细体会其中的区别即可。
命名是编码中极为重要的一环,希望大家能掌握其中的规律,让你编写的代码既功能强大,又颜值在线。优秀的命名习惯是专业精神和工匠精神的体现,也期待在像 云栈社区 这样的技术交流平台上,看到更多关于代码艺术与实践的精彩讨论。