3.9.3 命名规则
除了 保留字 和 关键字,其余的命名都要遵循一些规则或规范
- 工程命名:首字母大写,多个单词间使用下划线分隔,尽量使用英文简称 示例: Springboot_01_quickstart
- 包命名:纯小写英文字母,采用顶级域名作为前缀,例如com、net、org、edu、gov、cn、io等,随后紧跟 公司/组织/个人名称以及功能模块名称 示例:
package org.springframework.boot.autoconfigure.cloud package org.springframework.boot.util package java.beans package java.io- 类命名:通常采用名词进行命名,每个单词首字母都要大写,不建议缩写(一些约定俗称的除外) 示例:
class EmployeeService{ } class StudentDAO{- 接口命名:通常采用形容词或动词来描述接口的动作行为 示例:
public interface Runnable{ } public interface Comparable<T>{ } public interface CompletionService<V>{ }在Spring Framework标准库中,通常采用 "名词 + 动词/形容词"来命名接口 示例:public interface AfterAdvice{ } public interface TargetClassAware{ }- 接口实现类:在接口名的基础上将 "Impl"作为后缀 示例:
public interface OrderService{ } public class OrderServiceImpl implements OrderService{ }- 抽象类命名:在普通类的命名基础上,以 "Abstract/Base"作为前缀 示例:
public abstract class AbstractController{ } public abstract class BaseDao<T,ID>{ }以下是Spring Framework中常见的抽象类示例public abstract class AbstractAspectJAdvice{ }- 异常类命名:对于编码、环境和操作等异常,在普通类命名基础上,以 "Exception"作为后缀 示例:
public class ClassNotFoundException{ }另外,Java中还有一种系统异常,这类异常类命名使用 "Error"作为后缀 示例:public class NoClassDefFoundError{ }- 方法命名:首字母小写,多个单词则从第二个单词开始,使用驼峰命名方法进行书写,一般采用 "动词 /动词 + 名词" 示例:
public List<Integer> getUserIds(){ } public User getOne(){ }- 方法查询:对于查询或筛选获取数据的方法,通常采用 "find/query"作为前缀 示例:
public List<Integer> findAll(){ } public List<String> queryOrders(){ }- 方法条件查询:一个查询方法需要条件参数,则可以使用 "by/with"等字符作为方法名中条件的连接符
public User findByUsername(String username){ } public List<Integer> getUserIdsWithState(boolean state){ } public List<User> findAllByUsernameOrderByIdDesc(String username){ }- 方法设置:对于设置(set)、插入(insert)、修改(update)、删除(delete)等操作,应该将对应的动词作为其名词的前缀 示例:
public void setName(String name){ } public User insert(User user){ } public void update(User user){ } public void clearAll(){ }- 返回值Boolean方法:方法的返回值为布尔类型,应该使用 "is/has"作为前缀 示例:
public boolean isNotEmpty(){ } public boolean hasLength(){ }- 获取长度/数量方法:用于获取数据长度或者数量的方法,应该使用 length或者size命名 示例:
public long length(){ } public int size(){ }- 数据类型转换方法:用于将数据类型转换其他类型的方法,则可以使用 "to"作为前缀 示例:
public Set<Integer> mapToSet(Map map){ } public UserDto convertTo(User user){ } public String toString(Object obj){ }- 变量命名:与方法命名一样,以小写字母开头,多个单词从第二个单词开始首字母大写,不建议使用下划线作为分隔符号 示例:
private Long id; private String username; private Long orderId;- 常量命名规范:全部大写,多个单词之间使用下滑线进行分隔 示例:
public static final String LOGIN_USER_SESSION_KEY = "current_login_user"; public static final int MAX_AGE_VALUE = 120;- 枚举命名:与普通类一样,每个单词首字母都大写,而枚举类中定义的值遵循常量的命名规范,枚举值名称需要与类名有一定的关联性 示例:
public enum Color{ RED,YELLOW,BLUE,GREEN,WHITE; } public enum PhysicalSize{ TINY,SMALL,MEDIUM,LARGE,HUGE,GIGANTIC; }- 数组: 示例:
int array[] = new int[10]; int idArray[] ={1,2,3,4,5}; String nameArray[] = {"First","Yellow","Big"} public List<String> getNameById(Integer ids[]){ }- 复数或者集合:描述多个数据的变量名,尽量使用单词的复数形式 示例:
Collection<Order> orders; int values[]; List<Item> items;- 泛型类:在书写泛型类时,通常遵循以下的约定
示例:
E表示Element,通常表示集合元素
ID用于表示对象的唯一标识符类型
T表示Type(类型),通常表示Java类
K表示Key(键),通常用于Map中
V表示Value(值),通常用于Map中,于K成对出现
N表示Number,通常表示数值类型
? 表示不确定的Java类型
X表示异常
U,S表示任意的类型
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; }- 测试类和测试方法:测试类采用 "被测试业务模块名/被测试接口/被测试类 + Test"进行书写,测试方法采用 "test + 用例操作_状态的组合"进行书写 示例:
public class UserServiceTest{ public void testFindByUsernameAndPassword(){ } public void testUsernameExist_notExist(){ } public void testDeleteById_isOk(){ } }
补充,变量命名
推荐的命名规范有以下3种:
(1)Camel标记法:首字母是小写的,接下来的单词都以大写字母开头。
(2)Pascal标记法:首字母是大写的,接下来的单词都以大写字母开头。
(3)匈牙利标记法:在以Pascal标记法的变量前附加小写序列说明该变量的烈性。它使用1-3字符前缀表示数据类型,3个字符的前缀必须小写,前缀后面是由表意性强的一个单词或多个单词组成的名字,而且每个单词的首写字母大写,其他字母小写。