关于java:Java-命名规范非常全面可以收藏

2次阅读

共计 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 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

正文完
 0