zoukankan      html  css  js  c++  java
  • 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、equals方法

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

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

    提供了同样的判断逻辑的方法:Objcets.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...),这是个可变参数,参数列表可以是任意数量,所以像这样

    使用Object.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);
    
        }
        /*
         *运行结果:
         *  张三
         *  哈哈
         */
    }
  • 相关阅读:
    (六)面向对象进阶
    (五)绑定方法与非绑定方法
    (四)封装
    (三)多态与多态性
    (二)继承与派生
    (一)面向对象的程序设计
    网络协议
    三.计算机网络简介
    二.计算机的发展史及多道技术
    一.计算机基础知识
  • 原文地址:https://www.cnblogs.com/zhenbian/p/12925042.html
Copyright © 2011-2022 走看看