共计 7825 个字符,预计需要花费 20 分钟才能阅读完成。
起源:www.ramostear.com/blog/2020/03/20/2vxdaqjq.html
最近发现很多高级程序员写代码时很不标准,比方办法名 类名 等,如果遇到有代码洁癖的领导必定会被骂(什么垃圾代码),上面分享一篇不错的标准文章
在本文中,将从大到小,从外到内,总结 Java 编程中的命名标准。文中将会波及到日常工作中常见的命名示例,如包命名,类命名,接口命名,办法命名,变量命名,常类命名,抽象类命名,异样类命名以及扩大类命名等。我将依照我的项目工程目录构造,从包,类(接口,抽象类,异样类),办法,变量和常量的程序开展介绍。
本文是 Java 命名标准的介绍,倡议珍藏转发。
1. 包命名标准
包 (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
2. 类命名标准
类 (Class) 通常采纳名词进行命名,且首字母大写,如果一个类名蕴含两个以上名词,倡议应用驼峰命名 (Camel-Case) 法书写类名, 每个名词首字母也应该大写。个别地,类名的书写尽量使其放弃简略和形容的完整性,因而在书写类名时不倡议应用缩写(一些约定俗成的命名除外。
例如 Internationalization and 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 ArrayIndexOutOfBoundsException{ }
public class enum Thread.State{}
2.1 接口命名标准
首先,接口 (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{}
2.2 抽象类命名标准
抽象类 (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{}
2.3 异样类命名标准
异样类 (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{}
3. 办法命名标准
办法 (Method) 命名时, 其首字母应该小写,如果办法签名由多个单词组成,则从第二个单词起,应用驼峰命名法进行书写。个别地,在对办法进行命名时,通常采纳动词 / 动词 + 名词的组合,上面是办法命名的一些常见示例。
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> findAllByUsernameOrderByIdDesc(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. 变量命名标准
变量 (Variable) 命名包含参数名称,成员变量和局部变量。变量命名通常以小写字母结尾,如果变量名由多个单词形成,则从第二个单词起首字母须要大写,在变量命名过程中,不倡议应用“_”作为前缀或者单词之间的宰割符号。上面是一些常见的变量命名示例:
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. 枚举命名标准
枚举 (Enum) 类是一种非凡的类,其命名标准遵循一般类的命名约束条件,首字母大写,采纳驼峰命名法;枚举类中定义的值的名称遵循常量的命名标准,且枚举值的名称须要与类名有肯定的关联性,上面是枚举的一些示例:
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 泛型类
在书写泛型类时,通常做以下的约定:
- E 示意 Element,通常用在汇合中;
- ID 用于示意对象的惟一标识符类型
- T 示意 Type(类型),通常指代类;
- 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;
}
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 的统称 | Plain Ordinary Java Object 简略 Java 对象,它是一个简略的一般 Java 对象,禁止将类命名为 XxxxPOJO |
VO | 通常是视图管制层和模板引擎之间传递的数据对象 | Value Object 值对象,次要用于视图层,视图控制器将视图层所需的属性封装成一个对象,而后用一个 VO 对象在视图控制器和视图之间进行数据传输。 |
AO | 应用层对象 | Application Object,在 Web 层与 Service 层之间形象的复用对象模型,很少用。 |
上面将通过一张图来了解上述几种 O 之间互相转换的关系:
近期热文举荐:
1.1,000+ 道 Java 面试题及答案整顿(2021 最新版)
2. 别在再满屏的 if/ else 了,试试策略模式,真香!!
3. 卧槽!Java 中的 xx ≠ null 是什么新语法?
4.Spring Boot 2.5 重磅公布,光明模式太炸了!
5.《Java 开发手册(嵩山版)》最新公布,速速下载!
感觉不错,别忘了顺手点赞 + 转发哦!