由java.util.Objects类引发的对于编程的感想

由java.util.Objects类引发的对于编程的感想

Objects类介绍

Objects和Object 看起来很像,估计有一部分人是不知道它是干什么的,更没有使用过这个类。

Object 是 Java 中所有类的基类,位于java.lang包。

/**
 * @since 1.7
 */
public final class Objects {
    private Objects() {
        throw new AssertionError("No java.util.Objects instances for you!");
    }

    /**
     * Returns {@code true} if the arguments are equal to each other
     * and {@code false} otherwise.
     * Consequently, if both arguments are {@code null}, {@code true}
     * is returned and if exactly one argument is {@code null}, {@code
     * false} is returned.  Otherwise, equality is determined by using
     * the {@link Object#equals equals} method of the first
     * argument.
     *
     * @param a an object
     * @param b an object to be compared with {@code a} for equality
     * @return {@code true} if the arguments are equal to each other
     * and {@code false} otherwise
     * @see Object#equals(Object)
     */
    public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }
    }

由上面的部分源码我们可以初步得出一个这样的结论:
Objects 是 Object 的工具类,位于java.util包。它从jdk1.7开始才出现,被final修饰不能被继承,拥有私有的构造函数。它由一些静态的实用方法组成,用于比较两个对象,获取hashCode等。

部分方法介绍

1.equals()方法

在这里插入图片描述
equals方法是用来比较两个是否相等的方法,参数需要传入需要比较的两个对象。

2.deepEquals()方法
在这里插入图片描述

此方法用来深度比较两个对象。当参数是数组对象,其方法内部采用的是Arrays.deepEquals0方法的算法。使用Objects.deepEquals方法有个好处,当我们在写业务代码时,可以直接使用此方法来判断两个复杂类型,比如使用了泛型的列表对象List、或者通过反射得到的对象,不清楚对象的具体类型。

3.hashCode()方法
在这里插入图片描述

此方法用来获取一个对象的hash值。首先做了判空操作,然后返回了参数的hash码。

4.toString()方法
在这里插入图片描述
在这里插入图片描述
返回参数对象的字符串表示形式,如果参数为空对象null,则返回字符串“null”。

5.isNull()方法
在这里插入图片描述
判空方法,从jdk1.8开始。

6.nonNull()方法
在这里插入图片描述
判断非空方法,如果参数不为空则返回true。从jdk1.8开始。

一些感触

从上面Objects类可以看出,这个类的实现是十分简单的。但它的安全和逻辑是十分严谨的。

感触一:安全性做的比较到位
从上面的每一个方法中基本上都看到了判空的操作,相信我们自己的应用中有时就回报一些空指针的错误,这就是不规范因此的。因此我们在平时的开发中应提高一些警惕,尽量避免这样的错误,如空指针,数组角标越界等,尽量使自己的代码逻辑更严谨一些。

另一个严谨性的体现
在这里插入图片描述
当一个工具类确定不需要调用放来new出一个对象或者通过反射生成一个对象时可以这样做,这样做保证了一不能new二不能通过反射创建一个对象。

作为一个程序员必要的严谨性还是要有的

感触二:不要一些忽略性能问题

假如我们现在有一个字符串常量a和一个字符串变量b,相信我们大多数人比较两个属性值是否相等的代码是这样的:a.equals(b);因为a是一个常量,我们知道是不为空的,所以我们将a放在了前面,而b是一个变量,既然是变量它就有可能是空的。所以我们这样写是无可厚非的。

但你仔细比较Objects中的equals方法和我们自己写的比较方法,他们之间有什么不同呢?
首先判空操作我们是不需要了,Objects中的equals方法更有普遍性,可以兼容参数为空的情况。重要的是a==b这个操作
在这里插入图片描述

不要小看这个a==b的操作,这可是能够提升性能的一个判断,如果没有这一步操作,在上面的两个字符串比较中,如果a和b是同一个对象,相信这种情形有很多。但是我们直接调用equals方法来比较,看其内部实现:
在这里插入图片描述
可以清楚的看到其内部是经过了复杂的处理的,其具体的实现逻辑在这就不讨论了。无论是多么高效的算法实现也比不上一个a == b的操作效率高。

不要小看这一点的性能提高,在我们的项目中我们要是多注意一下这种性能方面的问题,我相信我们的app会变得比现在快的多。app的性能体现在方方面面,一点一点的性能优化聚集起来就是质的飞跃。同时平时忽略甚至认为这无关紧要是导致app越来越慢的真凶。

感触三:自己的事情自己做,逻辑清晰

在这里插入图片描述
从这里可以看到Objects类中的toString方法中直接调用了String的valueOf()方法。从代码上看十分简洁,并且转换成String的操作确实是属于String类的功能,也体现了代码的复用,指责也十分的清晰。想这样的代码再Objects中还有,有兴趣的可以自己找找看。

在我们平时的开发中,我们经常遇到一种万能类,一个类中什么功能都有,这种类给人的一种感觉是十分的不清晰,又杂又乱没有调理性也不能做到代码的复用。所以我们再实际开发中要分清职责,尽量做到自己的事情自己做,不要再创造万能类了,看起来真的很累。

结语:细节决定成败

原创文章 63 获赞 59 访问量 4万+

猜你喜欢

转载自blog.csdn.net/u013049016/article/details/100043872