Guava学习笔记(1)Objects,MoreObjects

从Guava.Objects的提供的一些方法开始学习

Objects主要方法

  • hashCodehashCode(Object... objects)
    为多个值生成一个hashCode,通过调用Arrays.hashCode(Object[])来实现
    警告:当只传递一个单独的对象的时候,这个方法的返回值与他本身的hashCode不相等
  • equalequal(Object a, Object b)
    当a和b都是null或者a和b的equals相等的时候返回true,其他的时候返回false
  • 其他的方法已经废弃,在下面的类中进行说明

MoreObjects主要方法

  • firstNonNull
    返回两个给定参数中不为空的第一个,如果都是空则抛出NullPointerException。
public static  T firstNonNull(@Nullable T first, @Nullable T second) {
    return first != null ? first : checkNotNull(second);
  }
  • toStringHelper方法
    返回一个ToStringHelper对象(MoreObjects内部类),当输入为null时抛出NullPointerException该类可以定制输出String的形式,以ClassName{x=1}或者MyObject{x=1}的形式进行输出,x可以以ToStringHelper#add("x", 1)的方法进行添加
    这个方法有三个重载的形式
toStringHelper(Object self) 
toStringHelper(Class clazz) 
toStringHelper(String className)

ToStringHelper#omitNullValues调用之后,字段中中值为空将不会显示在最后生成String中。
ToStringHelper#add(String name, Object value),name不能为空。这个方法会调用addHolder(name, value)方法,在addHolder使用ValueHolder 来保存键值对,ValueHolder是一个链表,调用toString()方法之后对这个链表进行遍历。有多个add的重载方法。ValueHolder 源码如下:

private static final class ValueHolder {
      String name;
      Object value;
      ValueHolder next;
    }

addaddHolder()生成一个新的节点:

private ValueHolder addHolder() {
      ValueHolder valueHolder = new ValueHolder();
      holderTail = holderTail.next = valueHolder; // 一行语句实现了链表尾节点后移并赋值
      return valueHolder;
    }
  • 下面来看下最后一个方法也是最重要的toString()方法
for (ValueHolder valueHolder = holderHead.next;
          valueHolder != null;
          valueHolder = valueHolder.next) { //遍历添加的属性值
        Object value = valueHolder.value;
        if (!omitNullValuesSnapshot || value != null) { // 当设置跳过值为null的字段,并且字段为null的时候跳过
          builder.append(nextSeparator);
          nextSeparator = ", ";

          if (valueHolder.name != null) {
            builder.append(valueHolder.name).append('=');
          }
          if (value != null && value.getClass().isArray()) { // 判断是否是数组
            Object[] objectArray = {value};
            String arrayString = Arrays.deepToString(objectArray); //Arrays.deepToString采用递归调用的方式遍历所有的嵌套数组并组成String输出。
            builder.append(arrayString.substring(1, arrayString.length() - 1)); // 去掉Arrays.deepToString返回的[],
          } else {
            builder.append(value);
          }
        }
      }

你可能感兴趣的:(Guava学习笔记(1)Objects,MoreObjects)