[Guava源码分析](6)Objects分析
来源:互联网 发布:锤子软件下载 编辑:程序博客网 时间:2024/06/05 19:21
1. 私有构造器
private Objects() {}
2. 判断两个可能为null的对象是否相等
public static boolean equal(@Nullable Object a, @Nullable Object b) { return a == b || (a != null && a.equals(b)); }
当一个对象中的字段可以为null时,实现Object.equals方法会很痛苦,因为不得不分别对它们进行null检查。使用Objects.equal帮助你执行null敏感的equals判断,从而避免抛出NullPointerException。
System.out.println(Objects.equal("a", "a")); // returns trueSystem.out.println(Objects.equal(null, "a")); // returns falseSystem.out.println(Objects.equal("a", null)); // returns falseSystem.out.println(Objects.equal(null, null)); // returns true
注意:
JDK7引入的Objects类提供了一样的方法Objects.equals。
3. hashcode(Object... objects)
Guava的Objects.hashCode()会对传入的字段属性计算出合理,顺序敏感的散列值。
假设有一个Book类,有4个属性:title,author,publisher,isbn。我们可以通过Objects.hashCode方法:
public int hashCode() { return Objects.hashCode(title,author,publisher,isbn); }
Objects.hashcode方法是使用Arrays.hashCode实现的:
public static int hashCode(@Nullable Object... objects) { return Arrays.hashCode(objects); }
Arrays.hashCode:
public static int hashCode(Object a[]) { if (a == null) return 0; int result = 1; for (Object element : a) result = 31 * result + (element == null ? 0 : element.hashCode()); return result; }
注意:
JDK7引入的Objects类提供了一样的方法Objects.hash(Object...)
4. toString
使用 Objects.toStringHelper可以轻松编写有用的toString方法。
public class Studnet { public void test(){ String str1 = Objects.toStringHelper(this).toString(); String str2 = Objects.toStringHelper(this).add("name","xiaosi").toString(); String str3 = Objects.toStringHelper("Stu").add("age",25).toString(); String str4 = Objects.toStringHelper("Stu").add("name","xiaosi").add("age",25).toString(); String str5 = Objects.toStringHelper("Stu").omitNullValues().add("name", "xiaosi").add("school",null).toString(); System.out.println("str1->" + str1); System.out.println("str2->" + str2); System.out.println("str3->" + str3); System.out.println("str4->" + str4); System.out.println("str5->" + str5); } public static void main(String[] args) { Studnet studnet = new Studnet(); studnet.test(); }}
结果:
str1->Studnet{}str2->Studnet{name=xiaosi}str3->Stu{age=25}str4->Stu{name=xiaosi, age=25}str5->Stu{name=xiaosi}
4.1 toStringHelper(Object self)
备注:这个方法在2016年6月弃用,使用
根据Object对象self来生成ToStringHelper对象
@Deprecated public static ToStringHelper toStringHelper(Object self) { return new ToStringHelper(MoreObjects.simpleName(self.getClass())); }
重载函数 根据class对象clazz生成ToStringHelper对象
@Deprecated public static ToStringHelper toStringHelper(Class<?> clazz) { return new ToStringHelper(MoreObjects.simpleName(clazz)); }
重载函数 根据字符串形式的className生成ToStringHelper对象
@Deprecated public static ToStringHelper toStringHelper(String className) { return new ToStringHelper(className); }
4.2 内部类ToStringHelper
public static final class ToStringHelper { private final String className; private ValueHolder holderHead = new ValueHolder(); private ValueHolder holderTail = holderHead; private boolean omitNullValues = false; // 构造函数 通过字符串格式的className构造ToStringHelper private ToStringHelper(String className) { this.className = checkNotNull(className); } // 存放输出的键值对 类似于链表 private static final class ValueHolder { String name; Object value; ValueHolder next; } // 设置是否过滤value为null的值 public ToStringHelper omitNullValues() { omitNullValues = true; return this; } // 添加待输出的键值对(name,value) public ToStringHelper add(String name, @Nullable Object value) { return addHolder(name, value); } // 重载函数 .... // 不建议这样使用 可以使用addValue(String,Object);代替 public ToStringHelper addValue(@Nullable Object value) { return addHolder(value); } // 重载函数 ... private ValueHolder addHolder() { ValueHolder valueHolder = new ValueHolder(); holderTail = holderTail.next = valueHolder; return valueHolder; } private ToStringHelper addHolder(@Nullable Object value) { ValueHolder valueHolder = addHolder(); valueHolder.value = value; return this; } private ToStringHelper addHolder(String name, @Nullable Object value) { ValueHolder valueHolder = addHolder(); valueHolder.value = value; valueHolder.name = checkNotNull(name); return this; } @Override public String toString() { // create a copy to keep it consistent in case value changes boolean omitNullValuesSnapshot = omitNullValues; String nextSeparator = ""; StringBuilder builder = new StringBuilder(32).append(className) .append('{'); // 输出键值对 for (ValueHolder valueHolder = holderHead.next; valueHolder != null; valueHolder = valueHolder.next) { // 如果value为null 不可过滤 或者 value不为null if (!omitNullValuesSnapshot || valueHolder.value != null) { builder.append(nextSeparator); nextSeparator = ", "; if (valueHolder.name != null) { builder.append(valueHolder.name).append('='); } builder.append(valueHolder.value); } } return builder.append('}').toString(); } }
只要给定想要输出的键值对,ToStringHelper就会自动帮助你格式化输出。
Objects.toStringHelper("Stu").add("age",25).toString();
0 0
- [Guava源码分析](6)Objects分析
- guava学习(一)ComparisonChain 源码分析
- [Guava源码日报](2)Strings分析
- [Guava源码日报](3)Joiner分析
- [Guava源码日报](5)Optional分析
- [Guava源码日报](7)Throwables分析
- 【源码分析】Guava源码解析之EventBus
- Guava源码分析——Proxy模式(TimeLimiter)
- Guava源码分析——Strategy模式(Splitter)
- Guava EventBus源码分析(二):注册订阅者方法
- Guava源码分析——ServiceManager
- 缓存框架Guava Cache部分源码分析
- Guava字符串处理Joiner源码分析
- Guava cacha 机制及源码分析
- Guava缓存器源码分析——CacheBuilderSpec
- Guava缓存器源码分析——CacheBuilder
- Guava缓存器源码分析——LocalCache
- Guava缓存器源码分析——数据查询
- Linux下检查是否安装过某软件包
- C/C++常用头文件及函数汇总
- WINDOWS下APACHE+PHP下载、安装、配置
- Array Partition I
- GreenDao3.x使用笔记
- [Guava源码分析](6)Objects分析
- Clion安装配置教程 [C语言编程for Windows]
- jsp访问原理
- pyhton函数式编程函数map、reduce、filter、lambda
- Java语法糖(3):泛型
- 全面解析js中的数据类型与类型转换
- hdu1789
- 包装类小总结
- Java中堆和栈创建对象的区别