• java代码之美(3)---guava 复写Object常用方法


    guava 复写Object常用方法

           Guava 是一个 Google 的基于java1.6的类库集合的扩展项目,这个库提供用于集合,缓存,支持原语,并发性,常见注解,字符串处理,I/O和验证的实用方法。

    这些高质量的 API 可以使你的Java代码更加优雅,更加简洁,让你工作更加轻松愉悦。 

    一、概述

          在Java中Object类是所有类的父类,其中有几个需要override的方法比如equals,hashCode和toString等方法。每次写这几个方法都要做很多重复性的判断,

    很多类库提供了覆写这几个方法的工具类, Guava也提供了类似的方式。下面我们来看看Guava中这几个方法简单使用。

         Guava中Objects类提供了很多和Object类作用相同、效率更高的方法可供使用:

    1、equal方法

           使用Obejct的equals方法进行相等判断,例如:test.equals("test");如果test为null,则会发生NullPointerException,Objects的equal方法可以帮助你

    避免NullPointerException,它的判断逻辑是这样的:return a == b || (a!=null&& a.equals(b));所以,可以很放心的使用,Objects.equal(test,"test")

    当然在JDK7中也提供了同样判断逻辑的方法:Objects.equals(test,"test");

    public class ObjectTest {
        
        @Test
        public void equalTest() {
            System.out.println(Objects.equal("a", "a"));
            System.out.println(Objects.equal(null, "a")); 
            System.out.println(Objects.equal("a", null)); 
            System.out.println(Objects.equal(null, null));
        }
    }
    /**输出结果
     * true
     * false
     * false
     * true
     */

     2、hashCode方法

    对于hashCode首先要明白两点:

          1、如果equals()判断两个对象相等,那么它们的hashCode()方法一定返回同样的值。

      2、并没有强制要求如果equals()判断两个对象不相等,它们的hashCode可以相同也可以不同。

    Guava提供给我们了一个更加简单的方法--Objects.hashCode(Object ...), 这是个可变参数的方法,参数列表可以是任意数量,所以可以像这样

    使用Objects.hashCode(field1, field2, ...,fieldn)。非常方便和简洁。

    import org.junit.Test;
    import com.google.common.base.Objects;
    
    public class ObjectTest {    
        @Test
        public void hashcodeTest() {
            System.out.println(Objects.hashCode("a"));
            System.out.println(Objects.hashCode("a"));
            System.out.println(Objects.hashCode("a","b"));
            System.out.println(Objects.hashCode("b","a"));
            System.out.println(Objects.hashCode("a","b","c"));
            
            Person person=new Person("peida",23);
            System.out.println(Objects.hashCode(person));
            System.out.println(Objects.hashCode(person));
        }
    }
    
    class Person {
        public String name;
        public int age;
    
        Person(String name, int age) {
            this.name = name;
            this.age = age;
        }
    }
    //输出结果
    128
    4066
    4096
    126145
    19313256
    19313256

    3、toStringHelper()方法

           因为每个类都直接或间接地继承自Object,因此每个类都有toString()方法。这个方法是用得最多的, 覆写得最多, 一个好的toString方法对于调试来说是非常重要的,

    但是写起来确实很不爽。Guava也提供了toString()方法。

    通过toStringHelper方法来输出你需要输出的属性字段

    import org.junit.Test;
    import com.google.common.base.Objects;
    
    public class ObjectTest {
        
        @Test
        public void toStringTest() {
             //this代表当前类,这里只输出x一个属性字段
            System.out.println(Objects.toStringHelper(this).add("x", 1).toString());
    
            //代表输出对象为Person对象  
    System.out.println(Objects.toStringHelper(Person.class).add("x", 1).toString()); //add可以叠加 Person person=new Person("peida",23); String result = Objects.toStringHelper(Person.class).add("name", person.name).add("age", person.age).toString(); System.out.print(result); } } class Person { public String name; public int age; Person(String name, int age) { this.name = name; this.age = age; } } //============输出=============== ObjectTest{x=1} Person{x=1} Person{name=peida, age=23}

    4、firstNonNull方法

      Object的firstNonNull方法可以根据传入的两个参数来返回一个非Null的参数,Guava现在推荐使用MoreObjects.firstNonNull(T first,T second)替代它。

    import com.google.common.base.MoreObjects;
    
    public class TestFilter {
    
        public static void main(String[] args) {
          //name不为空
            String  name="张三";
            String nann=  MoreObjects.firstNonNull(name, "哈哈");
            System.out.println(nann);
    
          //sex为null
            String   sex=null;
            String   sexx=  MoreObjects.firstNonNull(sex, "哈哈");
            System.out.println(sexx);
    
        }
        /*
         *运行结果:
         *  张三
         *  哈哈
         */
    }

    在实际开发中,Objects.equal(test,"test")和MoreObjects.firstNonNull(T first,T second)在许多实际场合还是非常有帮助的。

     想太多,做太少,中间的落差就是烦恼。想没有烦恼,要么别想,要么多做。中校【11】 

  • 相关阅读:
    写时复制集合 —— CopyOnWriteArrayList 源码原理阅读笔记
    初步整合vue-element-admin和GitDataV两个Vue开源框架方案实现大数据可视化
    IOS苹果登录sign in with apple后端校验
    IOS审核被拒:IOS苹果授权登录(Sign in with Apple)/Apple登录/苹果登录集成教程
    ios安装自定义基座失败问题
    IOS APP上架App Store及提交审核详细教程
    IOS APP报错:SyntaxError: Invalid regular expression: invalid group specifier name __ERROR
    Apple Pay苹果支付IOS in-App Purchase内购项目服务端校验
    浅析浏览器是如何工作的(一):V8引擎、JIT机制、JS代码解释执行与编译执行
    ApplePay苹果支付内购项目配置及代码实现及沙箱测试
  • 原文地址:https://www.cnblogs.com/qdhxhz/p/9404532.html
Copyright © 2020-2023  润新知