一位攻城狮的自我修养

代码书写不规范?应用性能低?这篇代码优化教你如何一步步避免这些问

2022-01-01  本文已影响0人  攻城狮Chova
优化

命名规范

类的命名规范

后缀 说明
Service 表明这个类是服务类<br />类中包含提供的业务服务方法
Impl 表明这个类是一个实现类
Dao 表明这个类封装了数据访问方法
Action 表明这个类用于直接处理页面请求,管理页面相关逻辑
Listener 表明这是一个响应事件的类
Event 表明这个类指代某一个事件
Servlet 表明这是一个Servlet类
Factory 表明这是一个对象的工厂类
Adapter 表明这是一个适配器类
Job 表明这是一个任务类
Wrapper 表明这是一个包装类<br />为某个类提供没有的能力
Bean 表明这是一个Java Bean类

代码优化

不要在代码中出现容易混淆的字母和数字

不要让变量脱变成变量

public static final int RANDOM_INT = Random().nextInt();

三元类型操作符的类型必须一致

避免使用序列化类在构造函数中为不变量赋值,反序列化时构造函数不会执行

使用序列化的持久方法解决部分属性持久化问题

private void writeObject(ObjectOutputStream out) throws IOException {
    // 惯例的写法放在第一行,表示JVM按照默认的规则写入对象
    out.defaultWriteObject();
    // 写入相应的值
    out.writeInt(intVar);
}

private void readObject() throws IOException, ClassNotFoundException {
    // 惯例写法放在第一行,表示JVM按照默认的规则读入对象
    out.defaultReadObject();
    // 读出相应的值
    intVar = var.readInt();
}

乘法和除法使用移位操作

for (val = 0; val < 10000; val += 5) {
    a = val * 8;
    b = val / 2
}

替换为:

for (val = 0; val < 10000; val +=5) {
    a = val << 3;
    b = val >> 1;
}

基本对象优化

instanceof操作符的左右必须有继承或者实现关系

i % 2 == 0 ? "偶数" : "奇数"

注意包装类的null值,包装类型参与运算,要做null值校验

不能使用包装类型进行大小比较

避免对象的浅拷贝

不要在循环用创建对象的引用

for (int i = 0; i < count; i++) {
    Object obj = new Object();
}

替换为:

Object obj = null;
for (int i = 0; i < count; i++) {
    obj = new Object();
}

减少对重复变量的计算

for (int i = 0; i < list.size(); i++) {
    ...
}

替换为:

for (int i = 0, int lenth = list.size(); i < length; i++) {
    ...
}

指定类和方法的final修饰符

重用对象

将常量声明为static final并以大写命名

使用局部变量

不要在循环用创建对象的引用

for (int i = 0; i < count; i++) {
    Object obj = new Object();
}

替换为:

Object obj = null;
for (int i = 0; i < count; i++) {
    obj = new Object();
}

不要将数组声明为public static final

合理使用静态变量

public class A {
    private static final B b = new B();
} 

使用Collection.isEmpty()来验证集合是否为空

指定集合的初始长度

顺序插入和随机访问比较多的场景使用ArrayList,元素删除和中间插入比较多的场景使用LinkedList

对于返回类型为Collection的返回为空时应该返回空数组或者空集合而不应该是null

public方法不要有太多的形式参数

不要对数组使用toString方法

不要对超出范围的基本数据类型做向下强制转型

全局的集合类属性中不使用的数据要及时remove掉

基本类型转字符串时使用toString方法

使用StringBuilder对循环中的字符串进行拼接

使用entrySet来遍历Map

HashMap<String, Object> map = new HashMap<>();
Set<Map.Entry<String, Object>> entrySet = map.entrySet();
Iterator<Map.Entry<String, Object>> it = entrySet.iterator();
while (it.hasNext()) {
    Map.Entry<String, String> entry = it.next();
    ...
}
Set<String> keySet = map.keySet();

使用for循环遍历实现RandomAccess接口的集合

if (list instanceof RandomAccess) {
    for (int i = 0; i < list.size(); i++) {}
} else {
    Iterator<?> iterator = list.iterable();
    while (iterator.hasNext()) {
        iterator.next();
    }

    for (List i : list) {}
}

使用Set集合实现Collection.contains查询集合中是否包含某个元素

不要使用集合实现直接赋值成员变量,应该使用静态代码块赋值

private static Map<String, Integer> intMap = new HashMap<>();
static {
    map.put("num", 1);
}

private static List<Integer> intList = new ArrayList<>();
static {
    intList.add(1);
}

对于Double类型计算时使用BigDecimal.valueOf转换,不能使用构造方法new BigDecimal(Double)进行转换

使用常量或者确定值来调用equals方法

注意String.split(regex)

类设计优化

枚举的成员变量必须是私有不可变的

懒加载策略

String init = "0";
if (i == 1) {
    list.add(init);
}

替换为:

if (i == 1) {
    String init = "0";
    list.add(init);
}

在程序的运行过程中避免使用反射

合理使用单例模式

及时清除不再需要的会话

使用@Deprecated注释过时的代码

线程优化

class TaxCallabletor implements Callable<Integer> {
    private int seedMoney;
    TaxCallabletor(int seedMoney) {
        this.seedMoney = money;
    }

    @Override
    public Integer call() throws Exception {
        /*
         * TimeUnit
         * 表示给定单位粒度的时间段
         */
        TimeUnit.MICROSECONDS.sleep(10000);
        return seedMoney / 10;
    }
}

public class TaxCallabletorTest {
    public static void main(String[] args) {
        
    }
}

使用同步代码块代替同步方法

及时关闭流

对资源的close分开操作

try {
    resource1.close();
    resource2.close();
} catch (Exception e) {
    ...
}

替换为:

try {
    resource1.close();
} catch (Exception e) {
    ...
}
try {
    resource2.close();
} catch (Exception e) {
    ... 
}

IO优化

使用数据库连接池和线程池

使用带缓冲的输入和输出流进行IO操作

异常优化

谨慎使用异常

不要在循环中使用tryCatch

不能使用NPE异常来判空

上一篇 下一篇

猜你喜欢

热点阅读