1. JDK 8 静态工具类的另一种方式
以前要在Java里实现所谓“静态工具类”(static utility class)的话,通常会做两件事:
- 把class声明为final,以免被继承;
- 声明一个private的空参数列表构造器,以免外部能创建该类的实例。
一个相应的例子就是java.util.Objects
类。不过在JDK 8中,由于接口支持了静态方法,所以我们可以使用接口来作为静态工具类实现的另一个种方式。因为接口默认必须是抽象的,所以不能用final来阻止别人继承或者实现这个接口,不过反正是抽象的,也不能实例化,所以可以用来做静态工具类。
public interface StringUtils {
/* 默认public */
static boolean endsWith(String str, String suffix) {
// ...
}
}
参考:R大博客
2. Java的Objects工具类
在Java.util包下,有一个Objects类,是在JDK1.7版本引入的,final类型,私有构造方法,方法也全是静态方法,作为Object的工具类,提供null-save(空指针安全的)或null-tolerant(可以容忍空指针的)方法,我们来了解一下。
2.1 equals方法
public static boolean equals(Object a, Object b) {
return (a == b) || (a != null && a.equals(b));
}
用于比较两个对象是否相等,底层是通过Object对象的equals方法来实现,通过该静态方法可以避免空指针的出现。
2.2 deepEquals方法
public static boolean deepEquals(Object a, Object b) {
if (a == b)
return true;
else if (a == null || b == null)
return false;
else
return Arrays.deepEquals0(a, b);
}
深度比较,其实就是对列表,数组类型的比较,可以看到,比较的方式是通过Arrays的deepEquals0方法来进行的。
2.3 hashCode方法
public static int hashCode(Object o) {
return o != null ? o.hashCode() : 0;
}
计算对象的hashCode值,如果是null,返回0,同样是通过Object的hashCode方法来实现的。
2.4 hash方法
public static int hash(Object... values) {
return Arrays.hashCode(values);
}
为一个数组或序列生成hashCode,底层是通过Arrays的hashCode方法来实现,其实相当于计算数组的hashCode。这个方法对于在包含多个字段的对象上重写Object.hashCode()非常有用。例如,如果一个对象有三个字段,x, y和z,可以这样写:
@Override public int hashCode() {
return Objects.hash(x, y, z);
}
需要注意的是,当hash方法的参数是单个对象时,返回的hashCode不等于该对象的hashCode方法返回的值,但可以通过hashCode方法来计算。
2.5 toString方法
toString方法有两个重载方法:
public static String toString(Object o) {
return String.valueOf(o);
}
public static String toString(Object o, String nullDefault) {
return (o != null) ? o.toString() : nullDefault;
}
其中都是通过调用Object的toString方法来实现,主要是对null的处理不同,上面那个方法参数如果为空,返回一个null
字符串,而下面那个方法可以指定为空时候的默认值。
2.6 compare方法
public static <T> int compare(T a, T b, Comparator<? super T> c) {
return (a == b) ? 0 : c.compare(a, b);
}
用于对两个对象的比较,其中需要指定具体的比较器。
2.7 requireNonNull方法
public static <T> T requireNonNull(T obj) {
if (obj == null)
throw new NullPointerException();
return obj;
}
public static <T> T requireNonNull(T obj, String message) {
if (obj == null)
throw new NullPointerException(message);
return obj;
}
public static <T> T requireNonNull(T obj, Supplier<String> messageSupplier) {
if (obj == null)
throw new NullPointerException(messageSupplier.get());
return obj;
}
非空校验方法,第一个方法主要用于方法和构造函数的参数校验,比如:
public Foo(Bar bar) {
this.bar = Objects.requireNonNull(bar);
}
而另一个具有两个参数的方法,在为空的情况下可以指定抛出的具体的错误信息,该方法主要用于对具有多个参数的方法和构造函数进行参数验证,比如:
public Foo(Bar bar, Baz baz) {
this.bar = Objects.requireNonNull(bar, "bar must not be null");
this.baz = Objects.requireNonNull(baz, "baz must not be null");
}
最后一个方法,与requireNonNull(Object, String)方法不同,本方法允许将消息的创建延迟到空检查结束之后
2.8 isNull方法
public static boolean isNull(Object obj) {
return obj == null;
}
就是判断对象是否为空,返回相应的布尔类型。
2.9 nonNull方法
public static boolean nonNull(Object obj) {
return obj != null;
}
和isNull方法相对应,判断对象是否非空,返回布尔类型。
3. Mybatis查询时候特殊字符的转义
在使用Mybatis框架,对MySQL使用like进行模糊查询的时候,比如%这些字符都是有特殊含义的,我们在查询的时候需要进行相关的转义,转义的方法可以通过:
private static final String SYMBOL = "%";
/**
* 模糊查询拼接%, 添加/转义符
*
* @param params the params
* @return string
*/
public static String addLikeParams(String params) {
if (StringUtils.isNotBlank(params)) {
params = SYMBOL + params.replaceAll("/", "//")
.replaceAll("%", "/%")
.replaceAll("_", "/_") + SYMBOL;
return params;
}
return null;
}
而在对应的XML文件中可以这样配置:
<if test="likeName != null and likeName != ''">
and nick_name like #{likeName} escape '/'
</if>
网友评论