包命名规范
包(Package) 的作用是将功能相似或相关的类或者接口进行分组管理,便于类的定位和查找,同时也可以使用包来避免类名的冲突和访问控制,使代码更容易维护。通常,包名使用小写英文字母进行命名,并使用 “.”
进行分割,每个被分割的单元只能包含一个 名词
。
一般地,包命名常采用顶级域名作为前缀,例如 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
类命名规范
类(Class) 通常采用 名词
进行命名,且 首字母大写
,如果一个类名包含两个以上名词,建议使用 驼峰命名
(Camel-Case) 法书写类名, 每个名词 首字母也应该大写
。一般地,类名的书写尽量使其保持简单和描述的完整性,因此在书写类名时不建议使用缩写(一些约定俗成的命名除外)。
例如 Internationalization and Localization 缩写成 i18n, Uniform Resource Identifier 缩写成 URI,Data Access Object 缩写成 DAO,JSON Web Token 缩写成 JWT,HyperText Markup Language 缩写成 HTML 等等。下列是一些常见的类命名示例:
class EmployeeService {
}
class StudentDAO {
}
class OrderItemEntity {
}
public class UserDTO {
}
public class UserServiceImpl {
}
public class OrderItemController {
}
下面是 Oracle Java 中的一些标准命名示例:
public class HTMLEditorKit {
}
public class ArrayIndexOutOfBoundsException {
}
public class enum Thread.State {
}
public abstract class HttpContext {
}
public interface ImageObserver {
}
接口命名规范
首先,接口(Interface) 是一种表述某一类型对象 动作
的特殊类;简单来说,接口也是类(不太严谨),所以,接口的名称的书写也应该符合类名书写规范,首字母应该大写
,与普通类名不同的是,接口命名时通常采用 形容词
或 动词
来描述接口的 动作行为
。下列是 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 {
}
抽象类命名规范
抽象类(Abstract Class) 是一种特殊的类,其命名与普通类的命名规范相当。一般地,为了将抽象类与普通类和接口做出区别,提高抽象类的可读性,在命名抽象类时,会以 “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 AbstractBeanFactoryPointcutAdvisor {
}
public abstract class AbstractCachingConfiguration {
}
public abstract class AbstractContextLoaderInitializer {
}
异常类命名规范
异常类(Exception Class) 也是类的一种,但与普通类命名不同的是,异常类在命名时需要使用 “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 {
}
方法命名规范
方法(Method) 命名时, 其 首字母应该小写
,如果方法签名由多个单词组成,则从第二个单词起,使用驼峰命名法进行书写。一般地,在对方法进行命名时,通常采用 动词 + 名词
的组合,下面是方法命名的一些常见示例。
表述获取
如果一个方法用于获取某个值,通常使用 “get”
作为其 前缀
,例如:
public String getUserName() {
}
public List<Integer> getUserIds() {
}
public User getOne() {
}
表述查询
如果方法需要通过查询或筛选的方式获取某个数据,通常使用 “find” / “query”
作为其 前缀
,例如:
public List<User> findOne(Integer id) {
}
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() {
}