初级程序员必看!Java编程从包到常量的详尽命名规范介绍及示例分享

本文会从大到小、从外到内来总结 Java 编程的命名规范。文中会涉及日常工作中常见的命名示例,像包的命名、类的命名、接口的命名、方法的命名、变量的命名、常类的命名、抽象类的命名、异常类的命名以及扩展类的命名等。我会依照项目工程目录结构,按照包、类(接口、抽象类、异常类)、方法、变量和常量的顺序展开介绍。
[id_1000055088]
1. 包命名规范
包的作用在于对功能相似或相关的类以及接口进行分组管理。这样便于对类进行定位和查找。同时,还能利用包来避免类名的冲突以及进行访问控制,让代码更易于维护。一般来说,包名是以小写英文字母来命名的,并且通过“.”进行分割,每个被分割的单元仅能包含一个名词。
通常情况下,包的命名会以顶级域名作为前缀,像 com、net、org、edu、gov、cn、io 等。接着,会紧跟公司/组织/个人的名称以及功能模块的名称。以下是一些包命名的示例:
package org.springframework.boot.autoconfigure.cloud
package org.springframework.boot.util
package org.hibernate.action
package org.hibernate.cfg
package com.alibaba.druid
package com.alibaba.druid.filter
package com.alibaba.nacos.client.config
package com.ramostear.blog.web
下面是Oracle Java的一些常见包命名例子:
package java.beans
package java.io
package java.lang
package java.net
package java.util
package javax.annotation
2. 类命名规范
类通常以名词来命名,并且首字母要大写。若一个类名包含两个及以上名词,建议采用驼峰命名法来书写类名,每个名词的首字母也需大写。通常情况下,类名的书写应尽量做到简单且能完整描述,所以在书写类名时不建议使用缩写,不过一些约定俗成的命名除外。
将“Internationalization and Localization 缩写成 i18n,Uniform Resource Identifier 缩写成 URI,Data Access Object 缩写成 DAO,JSON Web Token 缩写成 JWT,HyperText Markup Language 缩写成 HTML 等等”改写为:Internationalization 和 Localization 被缩写为 i18n,Uniform Resource Identifier 被缩写为 URI,Data Access Object 被缩写为 DAO,JSON Web Token 被缩写为 JWT,HyperText Markup Language 被缩写为 HTML 等等。下列是一些常见的类命名示例:
public class UserDTO{
}
class EmployeeService{
}
class StudentDAO{
}
class OrderItemEntity{
}
public class UserServiceImpl{
}
public class OrderItemController{
}
下面是 Oracle Java 中的一些标准命名示例:
public class HTMLEditorKit{
}
public abstract class HttpContext{
}
public interface ImageObserver{
}
public class 例如,当尝试访问数组中不存在的元素时,就可能引发此异常。{
}
public class enum Thread.State{
}
2.1 接口命名规范
接口是一种能表述某一类型对象动作的特殊类。简单来讲,接口属于类(这种说法不太严谨)。因此,接口的名称书写需符合类名书写规范,首字母要大写。与普通类名不一样的是,接口命名通常会用形容词或动词来描述其动作行为。以下是 Oracle Java 中一些标准库的接口以形容词命名的示例:
public interface Closeable{
}
public interface Cloneable{
}
public interface Runnable{
}
public interface Comparable<T>{
}
public interface CompletionService<V>{
}
public interface Iterable<T>{
}
public interface EventListener{
}
Spring Framework 标准库中,一般会用名词加动词或形容词的组合方式去命名接口。以下是 Spring Framework 里一些接口命名的示例:
public interface AfterAdvice{
}
public interface TargetClassAware{
}
public interface ApplicationContextAware{
}
public interface MessageSourceResolvable{
}
2.2 抽象类命名规范
抽象类是一种特殊的类,它的命名与普通类的命名规范相同。通常,为了区分抽象类与普通类和接口,提高抽象类的可读性,在给抽象类命名时,会用“Abstract”或“Base”作为类名的前缀。以下是编程中一些常见的命名示例:
public abstract class AbstractRepository<T>{
}
public abstract class AbstractController{
}
public abstract class BaseDao<T,ID>{
}
public abstract class AbstractCommonService<T>{
}
以下是Spring Framework中常见的抽象类示例:
public abstract class AbstractAspectJAdvice{
}
public abstract class AbstractSingletonProxyFactoryBean 是一个特定的类名,它在相关的编程环境或框架中具有特定的作用和功能。这个类可能用于创建单例代理对象,以实现某种特定的设计模式或功能需求。它在代码的架构和流程中扮演着重要的角色,通过它可以方便地管理和获取单例对象的代理实例。{
}
public abstract class Abstract Bean Factory Pointcut Advisor 是一个特定的概念或实体,它由“Abstract Bean Factory”(抽象 Bean 工厂)和“Pointcut Advisor”(切点顾问)组成。其中,“Abstract Bean Factory”负责管理和创建 Bean,而“Pointcut Advisor”则用于定义切点和通知。这个概念在相关的编程或开发领域中具有特定的作用和意义。{
}
public abstract class AbstractCachingConfiguration{
}
public abstract class AbstractContextLoaderInitializer 这是一个特定的初始化器名称,它在相关的编程环境或框架中具有特定的作用和功能。它可能用于加载和初始化上下文相关的资源或配置等。{
}
2.3 异常类命名规范
异常类属于类的范畴。与普通类命名有所差异,异常类在命名时需以“Exception”作为后缀。以下是常见的异常类命名示例:
public class FileNotFoundException{
}
public class UserAlreadyExistException{
}
public class TransactionException{
}
public class ClassNotFoundException{
}
public class IllegalArgumentException{
}
public class IndexOutOfBoundsException{
}
另外,在 Java 中存在另一类异常类。这类异常类属于系统异常。它们的命名是以“Error”作为后缀。这样做是为了与 Exception(编码、环境、操作等异常)相区分。以下是系统异常(非检查异常)的命名示例:
public abstract class VirtualMachineError{
}
public class StackOverflowError{
}
public class OutOfMemoryError{
}
public class IllegalAccessError{
}
public class NoClassDefFoundError{
}
public class NoSuchFieldError{
}
public class NoSuchMethodError{
}
3.方法命名规范
在给方法命名时,其首字母需小写。若方法签名由多个单词构成,那么从第二个单词开始,要使用驼峰命名法来书写。通常情况下,在对方法进行命名时,一般会采用动词或动词加名词的组合形式,以下是一些方法命名的常见示例。
3.1 表述获取
如果一个方法是用来获取某个值的,那么通常会用“get”作为它的前缀,比如:
public String getUserName(){
}
public List<Integer> getUserIds(){
}
public User getOne(){
}
3.2 表述查询
如果方法需要通过查询或者筛选的途径来获取某个数据,一般会用“find”或者“query”当作其前缀,比如:
public List<User> findOne(Integer id){
}
public List<Integer> findAll(){
}
public List<String> queryOrders(){
}
3.3 表述条件
若一个方法需要某些条件参数,那么能够用“by”或者“with”等字符当作方法名里条件的连接符号,比如:
public User findByUsername(String username){
}
public List<Integer> getUserIdsWithState(boolean state){
}
public List<User> 通过用户名进行查找,并按照 ID 降序进行排序(String username){
}
3.4 表述设置
如果一个方法要进行设置操作,就应该将“set”作为其名词的前缀;如果一个方法要进行插入操作,就应该将“insert”作为其名词的前缀;如果一个方法要进行修改操作,就应该将“update”作为其名词的前缀;如果一个方法要进行删除操作,就应该将“delete”作为其名词的前缀。
public void setName(String name){
}
public User insert(User user){
}
public void update(User user){
}
public void clearAll(){
}
3.5 其他规范
如果一个方法是用来获取某组数据的长度或者数量的,那么这个方法应该用 length 或者 size 来命名;要是方法的返回值是布尔类型(Boolean),这种情况下该方法应该以“is”或者“has”作为前缀。
如果一个方法是用于把一种类型的数据转换成另一种数据类型的,那么就可以用“to”来作为前缀。
下面是综合示例:
public long length(){
}
public int size(){
}
public boolean isOpen(){
}
public boolean isNotEmpty(){
}
public boolean hasLength(){
}
public Set<Integer> mapToSet(Map map){
}
public UserDto convertTo(User user){
}
public String toString(Object obj){
}
4. 变量命名规范
变量命名包含参数名称、成员变量以及局部变量。通常变量命名是以小写字母开始的,倘若变量名由多个单词所组成,那么从第二个单词开始首字母就得大写。在进行变量命名的时候,不建议把“_”当作前缀或者用于单词之间的分割符号。以下是一些较为常见的变量命名示例:
private String nickName;
private String mobileNumber;
private Long id;
private String username;
private Long orderId;
private Long orderItemId;
5. 常量命名规范
通常情况下,常量的名称是以全部大写的英文单词来书写的。倘若常量的名称是由多个单词所构成的,那么这些单词之间一律使用“_”来进行分隔。以下是常量命名的示例:
public static final String LOGIN_USER_SESSION_KEY = "current_login_user";
public static final int MAX_AGE_VALUE = 120;
public static final int DEFAULT_PAGE_NO = 1;
public static final long MAX_PAGE_SIZE = 1000;
public static final boolean HAS_LICENSE = false;
public static final boolean IS_CHECKED = false;
6. 枚举命名规范
枚举类是一种特殊的类。它的命名规范遵循普通类的命名约束条件,首字母大写,采用驼峰命名法。在枚举类中定义的值的名称遵循常量的命名规范,并且枚举值的名称需要与类名有一定的关联性。下面是枚举的一些示例:
public enum Color{
RED,YELLOW,BLUE,GREEN,WHITE;
}
public enum PhysicalSize{
TINY,SMALL,MEDIUM,LARGE,HUGE,GIGANTIC;
}
下面是Oracle Java标准库中的一个示例:
public enum ElementType{
TYPE,
FIELD,
METHOD,
PARAMETER,
CONSTRUCTOR,
LOCAL_VARIABLE,
ANNOTATION_TYPE,
PACKAGE,
TYPE_PARAMETER,
TYPE_USE;
}
7. 其他命名规范 7.1 数组
在定义数组时,为了便于阅读,尽量保持以下的书写规范:
int[] array = new int[10];
int[] idArray ={1,2,3,4,5};
String[] nameArray = {"First","Yellow","Big"}
public List<String> getNameById(Integer[] ids){
}
public List<String> getNameById(Integer...ids){
}
7.2 表述复数或者集合
当一个变量用来描述多个数据时,要尽量以单词的复数形式来书写,比如:
Collection<Order> orders;
int[] values;
List<Item> items;
另外,要是所表述的是一个 Map 数据,那就应该在其后使用“map”作为后缀,例如:
Map<String,User> userMap;
Map<String,List<Object>> listMap;
7.3 泛型类
在书写泛型类时,通常做以下的约定:
下面是泛型类的书写示例:
public class HashSet<E> extends AbstractSet<E>{
}
public class HashMap<K,V> extends AbstractMap<K,V>{
}
public class ThreadLocal<T>{
}
public interface Functor<T,X extends Throwable>{
T val() throws X;
}
public class Container<K,V>{
private K key;
private V value;
Container(K key,V value){
this.key = key;
this.value = value;
}
}
public interface BaseRepository<T,ID>{
T findById(ID id);
void update(T t);
List<T> findByIds(ID...ids);
}
public static <T> List<T> methodName(Class<T> clz){
List<T> dataList = getByClz(clz);
return dataList;
}
7.4 接口实现类
为便于阅读,通常情况下,建议接口实现类使用“Impl”作为后缀,不建议用大写的“I”作为接口前缀,以下是接口和接口实现类的书写示例。
推荐写法:
public interface OrderService{
}
public class OrderServiceImpl implements OrderService{
}
不建议的写法:
public interface IOrderService{
}
public class OrderService implements IOrderService{
}
7.5 测试类和测试方法
在项目里,测试类是以被测试业务模块名、被测试接口或者被测试类加上“Test”这样的方式来进行书写的。并且,测试类中的测试函数是通过“test”与用例操作和状态进行组合的方式来书写的,就像这样:
public class UserServiceTest{
public void testFindByUsernameAndPassword(){
}
public void testUsernameExist_notExist(){
}
public void testDeleteById_isOk(){
}
}
8 扩展:速记 Java 开发中的各种O
最后,用一张表和图来快速梳理 Java 中 BO、DTO、DAO、PO、POJO、VO 之间的含义、区别以及联系。
名称使用范围解释说明
BO
用于与 Service、Manager、Business 等业务相关的类的命名
Business Object 是业务处理对象,它的主要作用是将业务逻辑封装成一个对象。
DTO
经过加工后的PO对象,其内部属性可能增加或减少
Data Transfer Object 即数据传输对象,它主要被应用于像远程调用这类需要大量传输数据的场景之中。比如说,能够把一个或者多个 PO 类的部分属性,亦或是全部属性,封装成 DTO 来进行传输。
DAO
用于对数据库进行读写操作的类进行命名
Data Access Object 即数据访问对象,它的主要作用是对数据库的访问进行封装。借助 DAO,能够把 POJO 持久化为 PO,同时也可以利用 PO 来封装出 VO 和 DTO。
PO
Bean,Entity等类的命名
持久化对象即 Persistant Object,它是数据库表中的数据在 Java 对象中的映射状态。可以简单地认为,一个 PO 对象就相当于数据库表中的一条记录。
POJO
POJO是DO/DTO/BO/VO的统称
简单 Java 对象,它是一个普通的 Java 对象,不可以将类命名为 XxxxPOJO。
VO
通常是视图控制层和模板引擎之间传递的数据对象
Value Object 是值对象,主要作用于视图层。视图控制器会把视图层所需要的属性封装成一个对象,接着通过一个 VO 对象来在视图控制器与视图之间进行数据的传输。
AO
应用层对象
Application Object 是在 Web 层与 Service 层之间抽象出来的复用对象模型,这种对象模型使用得很少。
下面将通过一张图来理解上述几种O之间相互转换的关系:
转载:Java 命名规范(非常全面)