美文网首页
Java一些小技巧使用

Java一些小技巧使用

作者: 骑着乌龟去看海 | 来源:发表于2018-08-19 10:06 被阅读13次
1. JDK 8 静态工具类的另一种方式

以前要在Java里实现所谓“静态工具类”(static utility class)的话,通常会做两件事:

  1. 把class声明为final,以免被继承;
  2. 声明一个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>

相关文章

网友评论

      本文标题:Java一些小技巧使用

      本文链接:https://www.haomeiwen.com/subject/ixfciftx.html