techiall / Blog

🍋 [My Blog] See discussions
https://github.com/techiall/Blog/discussions
MIT License
8 stars 1 forks source link

关于工具类 #71

Open techiall opened 4 years ago

techiall commented 4 years ago

在写项目过程中,自己写了一些工具类,在此把自己的想法和做法记录一下。

Q: 关于工具类的命名 / 存放?

A: 工具类统一放在 util 包内,工具类统一以 xxxUtils 命名,Utils 结尾。如 TimeUtils

Q: 关于工具类的定义?

A: 以 TimeUtils 定义为例。

方式一,将构造方法私有化,再严格一点,在私有方法里面加个抛异常(防止通过反射调用,调用后会抛异常);final 修饰类说明不能被继承。

/**
 * @author techial
 */
public final class TimeUtils {
    private TimeUtils() {
        // throw new IllegalStateException("Utility class");
    }
}

方式二,巧用 abstract 关键字,抽象类不能被实例化,如果用反射去调用,会抛出异常。

你也可以继承这个抽象类,扩展这个工具类;不像方式一,不能继承扩展。

/**
 * @author techial
 */
public abstract class TimeUtils {

}

Q: 工具类方法怎么写?

A: public static 修饰方法,如果有传入的参数,尽量使用 @Nullable / @NonNull 注解,提醒调用者关于 null 情况检查。(加了注解 IDE 也会提醒)

这两个注解是 Spring 里面的,IDEA 也有提供对应的注解。

@Nullable 对象可能为 null

@NonNull 对象不为 null

    /**
     * 返回今天零点 Instant
     */
    public static Instant todayZeroTimeInstant() {
        return Instant.now().truncatedTo(ChronoUnit.DAYS);
    }

import org.springframework.lang.Nullable;
import org.springframework.lang.NonNull;

    public static boolean between(@Nullable Long start, @Nullable Long end, @Nullable Long target) {
        if (start == null || end == null || target == null) {
            return false;
        }
        return target > start && target < end;
    }

other

关于工具类,个人还是偏向于使用 abstract 关键字来定义类,思路来源于 Spring 的工具类。

final 加私有构造方法根据有点麻烦,毕竟你还要多手写一个私有构造方法。

其实在项目中还有一类用的比较多,也就是常量类,定义和工具类类似。

public abstract class ProfileConst {
    public static final String DEV = "dev";
    public static final String PROD = "prod";
    public static final String TEST = "test";
}