本固枝荣 —— Java编程规范1

Java手册中的【强制】、【推荐】、【参考】是按照同一类型一条条罗列归纳的,而我打算按照项目中的代码为中心,比对手册中的规范进行学习和总结,一方面纠正自己不好的编程习惯,二是养成一种规范编码的意识。

那就从最简单的POJO(即简单的Java对象)开始吧:(以定义的VO类为例)

package com.xxwei.demo.enity.vo;

import java.io.Serializable;
import java.util.Objects;

/**
 * 【参考】POJO 是 DO/DTO/BO/VO 的统称,禁止命名成 xxxPOJO,展示对象:xxxVO,xxx 一般为网页名称。
 * 【强制】序列化类新增属性时,请不要修改 serialVersionUID 字段,避免反序列失败;如果完全不兼容升级,避免反序列化混乱,那么请修改 serialVersionUID 值。
 * 【强制】类名使用 UpperCamelCase 风格,但以下情形例外:DO / BO / DTO / VO / AO / PO / UID 等。
 * 【强制】所有编程相关的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
 * 【强制】代码和注释中都要避免使用任何语言的种族歧视性词语。
 * 【强制】所有的类都必须添加创建者和创建日期。
 * 【强制】类、类属性、类方法的注释必须使用 Javadoc 规范,使用格式,不得使用// xxx 方式。
 * 【推荐】与其“半吊子”英文来注释,不如用中文注释把问题说清楚。专有名词与关键字保持英文原文即可。
 * 【推荐】代码修改的同时,注释也要进行相应的修改,尤其是参数、返回值、异常、核心逻辑等的修改。
 * 【参考】在类中删除未使用的任何字段、方法、内部类;在方法中删除未使用的任何参数声明与内部变量。
 */
public class OrderVO implements Serializable {
    private static final long serialVersionUID = 1000L;
    // 【强制】方法名、参数名、成员变量、局部变量都统一使用 lowerCamelCase 风格。
    // 【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
    // 【强制】定义 DO/DTO/VO 等 POJO 类时,不要设定任何属性默认值。
    // 【强制】所有的 POJO 类属性必须使用包装数据类型。
    // 【强制】定义数据对象 DO 类时,属性类型要与数据库字段类型相匹配。
    // 【强制】杜绝完全不规范的缩写,避免望文不知义,如orderCount不能写成orderC。
    // 【推荐】为了达到代码自解释的目标,任何自定义编程元素在命名时,使用尽量完整的单词组合来表达。
    // 【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。
    // 【推荐】在常量与变量的命名时,表示类型的名词放在词尾,以提升辨识度。
    // 【强制】在 long 或者 Long 赋值时,数值后使用大写字母 L,不能是小写字母 l,小写容易跟数字混淆,造成误解。
    // 在类中删除未使用的任何字段、方法、内部类;在方法中删除未使用的任何参数声明与内部变量。
    public String orderName;
    public Integer orderType;
    public Long orderCount;
    public Boolean canDelete;

    // 【推荐】当一个类有多个构造方法,或者多个同名方法,这些方法应该按顺序放置在一起,便于阅读,此条规则优先于下一条。
    // 【强制】构造方法里面禁止加入任何业务逻辑,如果有初始化逻辑,请放在 init 方法中。
    public OrderVO() { }

    public OrderVO(String orderName) {
        this.orderName = orderName;
    }

    public OrderVO(String orderName, int orderType) {
        this.orderName = orderName;
        this.orderType = orderType;
    }

    // 【强制】禁止在 POJO 类中,同时存在对应属性 xxx 的 isXxx()和 getXxx()方法
    public String getOrderName() {
        return orderName;
    }

    // 【推荐】setter 方法中,参数名称与类成员变量名称一致,this.成员名 = 参数名。
    public void setOrderName(String orderName) {
//        if (!orderName.isEmpty())
//            orderName = orderName + " pass";// 在 getter/setter 方法中,不要增加业务逻辑,增加排查问题的难度。
        this.orderName = orderName;
    }

    public Integer getOrderType() {
        return orderType;
    }

    public void setOrderType(Integer orderType) {
        this.orderType = orderType;
    }

    public Long getOrderCount() {
        return orderCount;
    }

    public void setOrderCount(Long orderCount) {
        this.orderCount = orderCount;
    }

    public Boolean isCanDelete() {
        return canDelete;
    }

    public void setCanDelete(Boolean canDelete) {
        this.canDelete = canDelete;
    }

    // 【强制】单行字符数限制不超过 120 个,超出需要换行。
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof OrderVO)) return false;
        OrderVO orderVO = (OrderVO) o;
        return getOrderName().equals(orderVO.getOrderName())
                && getOrderType().equals(orderVO.getOrderType())
                && getOrderCount().equals(orderVO.getOrderCount())
                && canDelete.equals(orderVO.canDelete);
    }

    // 【强制】所有的覆写方法,必须加@Override 注解。
    @Override
    public int hashCode() {
        return Objects.hash(getOrderName(), getOrderType(), getOrderCount(), canDelete);
    }


    // 【强制】POJO 类必须写 toString 方法,当抛出异常时,可打印其属性值,便于排查问题。
    @Override
    public String toString() {
        return "OrderVO{" +
                "orderName='" + orderName + '\'' +
                ", orderType=" + orderType +
                ", orderCount=" + orderCount +
                ", canDelete=" + canDelete +
                '}';
    }
}

在VO类的代码里,将相关的规范已经罗列,对比后发现有几处需要注意或者纠正:(标记红色的是之前的坏习惯,今后编码注意纠正~)

  • 【强制】所有的类都必须添加创建者和创建日期。

      ---> 使用IDEA话,可以在类注释格式中添加这两个。

  • 【强制】类、类属性、类方法的注释必须使用 Javadoc 规范,使用格式,不得使用// xxx 方式。

      ---> 实际编程中对类的方法,属性注释已经习惯了使用//方式,这个需要纠正!!!JDK源码均是Javadoc 规范,可参考此。

  • 【参考】在类中删除未使用的任何字段、方法、内部类;在方法中删除未使用的任何参数声明与内部变量。

      ---> 正常情况下不会出现此类问题,但修改代码时容易造成修改后未删除不再使用的代码。

  • 【强制】定义数据对象 DO 类时,属性类型要与数据库字段类型相匹配。

      ---> DO类是与数据库进行ORM操作时对应的实体类,为了减少失误情况,可利用IDEA自动生成与数据库字段匹配的实体类的功能。

  • 【强制】所有的 POJO 类属性必须使用包装数据类型。

      ---> 实际编程中已经习惯了基本类型与包装类型的混用,这个需要纠正!!!

  • 【强制】POJO 类中的任何布尔类型的变量,都不要加 is 前缀,否则部分框架解析会引起序列化错误。

      ---> 实际编程中容易使用is开头的命名,如isFinished,isFull,isDeleted等,这个需要纠正!!定义为基本数据类型 Boolean isDeleted 的属性,它的方法也是 isDeleted(),框架在反向解析的时 候,“误以为”对应的属性名称是 deleted,导致属性获取不到,进而抛出异常。可以用can、weather等。

  • 【强制】在 getter/setter 方法中,不要增加业务逻辑,增加排查问题的难度。

      ---> 在编码的早期容易干些这种事情,增加了代码的复杂度,注意这种现象不要再发生。

  • 【强制】POJO 类必须写 toString 方法,当抛出异常时,可打印其属性值,便于排查问题。

      ---> 实际编程中很少重写toString方法,这个需要格外注意!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值