关于java:Java开发之规范

32次阅读

共计 2460 个字符,预计需要花费 7 分钟才能阅读完成。

1. 显示申明 UID
所有可序列化类都显示申明 serialVersionUID 值,若不显示申明,零碎会默认生成一个 UID,这样在这个对象进行序列化与反序列的时候,如果对 java 培训象增加一个属性或者删除一个属性,那么默认的 UID 也会产生扭转,也就会导致反序列化时候就会呈现:java.io.InvalidClassException
案例剖析
创立一个 Person 类,定义两个属性 name,age。通过 redis 进行缓存对象序列化后的 byte[]。而后在批改 Person 类属性,减少或删除一个属性,比方减少一个 address 属性。再反序列之前存储在 redis 缓存的 byte[]。会呈现反序列化失败(ps: 这边只是演示成果)
public class UIDTest {

public static void main(String[] args) {
    try {
        // 第一步存储序列化后的对象
        Person person = new Person("jack2", 21);
        RedisUtils.stringSetBit("jack2", serializeObj(person));
        // 第二步,减少批改 Person 类属性,进行反序列化
        Person p1 = (Person) deserialize(RedisUtils.byteGet("jack2"));
        System.out.println(p1);
    } catch (Exception ex) {ex.printStackTrace();
    }
}
public static byte[] serializeObj(Object obj) {try (ByteArrayOutputStream os = new ByteArrayOutputStream(); ObjectOutputStream ot = new ObjectOutputStream(os)) {ot.writeObject(obj);
        return os.toByteArray();} catch (IOException ex) {ex.printStackTrace();
    }
    return null;
}
public static Object deserialize(byte[] bytes) {try (ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes); ObjectInputStream objectInputStream = new ObjectInputStream
            (inputStream)) {return objectInputStream.readObject();
    } catch (Exception ex) {ex.printStackTrace();
    }
    return null;
}

}
• idea 创立设置,开启短少 UID 提醒

2. 校验包装类型是否为 null
Java 引入包装类型是为了解决根本类型无奈实例化的问题,便于让一个根本类型也能加入到面向对象的编程世界中。因为包装类型的默认值是 null,所以为了避免万恶的 java.lang.NullPointerException 谬误,所以在应用包装类型时候,必须要校验包装类型是否为 null
提醒
•【强制】所有的 POJO 类属性必须应用包装数据类型
•【强制】RPC 办法的返回值和参数必须应用包装数据类型
•【举荐】所有的局部变量应用根本数据类型

3. 用 BigDecimal 示意金额
java.math.BigDecimal 是专门为了补救浮点型无奈准确计算的缺憾而设计的类,并且它自身也提供了加减乘除的罕用数学算法。特地是与数据库 Decimal 类型的字段映射的。而如果是财务运算,更加应该应用 BigDecimal 类型来示意金额。并且尽量应用 String 类型的构造函数。

4.POJO 类覆写 toString()
覆写 POJO 类的 toString(),因为 Java 提供的默认的 toString 办法不敌对,打印进去看不懂。尤其在理论开发过程中,当办法抛出异样的时候,调用下 POJO 的 toString()办法打印出属性值。便于问题排查。举荐应用:apache 的 commons 工具包中 ToStringBuilder 类

5. 工具类不可实例化
理论我的项目中,避不可免,要写一些 Utils 类。然而在写这些工具类的时候,要让工具类不可实例化。因为这些工具类只是提供了一些通用的非业务畛域的专用办法,没有额定的属性,咱们仅仅调用定义的办法。所以没有必须让其实例化。
• 优良代码观赏

6. 优先应用 StringBuilder
在频繁进行字符串的运算(如拼接、替换、删除等),优先思考 StringBuilder,如 SQL 语句的拼装、Json 的封装等等。
7. 指定汇合的初始化大小
咱们在应用 ArrayList、HashMap 等汇合的时候,个别都是间接:ArrayListstrs = new ArrayList<>(); 而后进行 add、remove 等办法进行操作,因为在它的个性就是动静治理长度的。所以咱们毋庸放心超出长度的问题。然而为了写出高效的代码,必须明确指出汇合初始化大小。
• 源码查看


8. 资源对象、流对象及时回收
对于数据库资源、文件操作、流操作须要及时进行 close。Java7 以上,能够应用语法:try-with-resources 能够实现主动敞开资源对象。

9. 用 ThreadPoolExecutor 创立线程池
在理论开发中,在解决多任务的状况下,通常想到为了节约解决工夫,须要应用多线程技术来缩短工夫。那么在编写高质量 Java 代码,须要应用 ThreadPoolExecutor 来显示创立线程池。

10. 让正文正确、清晰、简洁
• 1. 类、属性、办法的正文必须应用 Javadoc 标准,应用 /*xxx/ 格局
• 2. 所有形象办法(包含接口办法)除了返回值、参数、异样还须要要指出该办法做什么事件,实现什么性能
• 3. 所有的类必须增加创建者和创立日期
• 4. 办法内的正文必须在被正文语句的上方,不能跟在正文语句前面
• 5. 所有枚举类型必须要有正文,阐明每个数据项的用处

正文完
 0