All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.tinygroup.commons.tools.ObjectUtil Maven / Gradle / Ivy

There is a newer version: 2.2.3
Show newest version
/**
 *  Copyright (c) 1997-2013, www.tinygroup.org ([email protected]).
 *
 *  Licensed under the GPL, Version 3.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *       http://www.gnu.org/licenses/gpl.html
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package org.tinygroup.commons.tools;

import java.io.IOException;
import java.util.Arrays;

import static org.tinygroup.commons.tools.Assert.assertNotNull;
import static org.tinygroup.commons.tools.BasicConstant.EMPTY_STRING;


/**
 * 有关Object处理的工具类。
 * 

* 这个类中的每个方法都可以“安全”地处理null,而不会抛出NullPointerException。 *

* * @author renhui */ public class ObjectUtil { // ========================================================================== // 比较函数。 // // 以下方法用来比较两个对象的值或类型是否相同。 // ========================================================================== /** * 比较两个对象是否完全相等。 *

* 此方法可以正确地比较多维数组。 *

*

     * ObjectUtil.equals(null, null)                  = true
     * ObjectUtil.equals(null, "")                    = false
     * ObjectUtil.equals("", null)                    = false
     * ObjectUtil.equals("", "")                      = true
     * ObjectUtil.equals(Boolean.TRUE, null)          = false
     * ObjectUtil.equals(Boolean.TRUE, "true")        = false
     * ObjectUtil.equals(Boolean.TRUE, Boolean.TRUE)  = true
     * ObjectUtil.equals(Boolean.TRUE, Boolean.FALSE) = false
     * 
*

*

* * @param object1 对象1 * @param object2 对象2 * @return 如果相等, 则返回true */ public static boolean isEquals(Object object1, Object object2) { if (object1 == object2) { return true; } if (object1 == null || object2 == null) { return false; } if (!object1.getClass().equals(object2.getClass())) { return false; } if (object1 instanceof Object[]) { return Arrays.deepEquals((Object[]) object1, (Object[]) object2); } else if (object1 instanceof int[]) { return Arrays.equals((int[]) object1, (int[]) object2); } else if (object1 instanceof long[]) { return Arrays.equals((long[]) object1, (long[]) object2); } else if (object1 instanceof short[]) { return Arrays.equals((short[]) object1, (short[]) object2); } else if (object1 instanceof byte[]) { return Arrays.equals((byte[]) object1, (byte[]) object2); } else if (object1 instanceof double[]) { return Arrays.equals((double[]) object1, (double[]) object2); } else if (object1 instanceof float[]) { return Arrays.equals((float[]) object1, (float[]) object2); } else if (object1 instanceof char[]) { return Arrays.equals((char[]) object1, (char[]) object2); } else if (object1 instanceof boolean[]) { return Arrays.equals((boolean[]) object1, (boolean[]) object2); } else { return object1.equals(object2); } } /** * 检查两个对象是否属于相同类型。null将被看作任意类型。 * * @param object1 对象1 * @param object2 对象2 * @return 如果两个对象有相同的类型,则返回true */ public static boolean isSameType(Object object1, Object object2) { if (object1 == null || object2 == null) { return true; } return object1.getClass().equals(object2.getClass()); } /** * 如果对象为null,则返回指定默认对象,否则返回对象本身。 *

*

     * ObjectUtil.defaultIfNull(null, null)      = null
     * ObjectUtil.defaultIfNull(null, "")        = ""
     * ObjectUtil.defaultIfNull(null, "zz")      = "zz"
     * ObjectUtil.defaultIfNull("abc", *)        = "abc"
     * ObjectUtil.defaultIfNull(Boolean.TRUE, *) = Boolean.TRUE
     * 
* * @param object 要测试的对象 * @param defaultValue 默认值 * @return 对象本身或默认对象 */ public static T defaultIfNull(T object, S defaultValue) { return object == null ? defaultValue : object; } // ========================================================================== // 判空函数。 // ========================================================================== /** 是否为null、空字符串、或空数组。 */ public static boolean isEmptyObject(Object object) { if (object == null) { return true; } else if (object instanceof String) { return StringUtil.isEmpty((String) object); } else if (object.getClass().isArray()) { return ArrayUtil.isEmptyArray(object); } else { return false; } } // ========================================================================== // Hash code函数。 // // 以下方法用来取得对象的hash code。 // ========================================================================== /** * 取得对象的hash值, 如果对象为null, 则返回0。 *

* 此方法可以正确地处理多维数组。 *

* * @param object 对象 * @return hash值 */ public static int hashCode(Object object) { if (object == null) { return 0; } else if (object instanceof Object[]) { return Arrays.deepHashCode((Object[]) object); } else if (object instanceof int[]) { return Arrays.hashCode((int[]) object); } else if (object instanceof long[]) { return Arrays.hashCode((long[]) object); } else if (object instanceof short[]) { return Arrays.hashCode((short[]) object); } else if (object instanceof byte[]) { return Arrays.hashCode((byte[]) object); } else if (object instanceof double[]) { return Arrays.hashCode((double[]) object); } else if (object instanceof float[]) { return Arrays.hashCode((float[]) object); } else if (object instanceof char[]) { return Arrays.hashCode((char[]) object); } else if (object instanceof boolean[]) { return Arrays.hashCode((boolean[]) object); } else { return object.hashCode(); } } // ========================================================================== // 取得对象的identity。 // ========================================================================== /** * 取得对象的原始的hash值, 如果对象为null, 则返回0。 *

* 该方法使用System.identityHashCode来取得hash值,该值不受对象本身的 * hashCode方法的影响。 *

* * @param object 对象 * @return hash值 */ public static int identityHashCode(Object object) { return object == null ? 0 : System.identityHashCode(object); } /** * 取得对象自身的identity,如同对象没有覆盖toString()方法时, * Object.toString()的原始输出。 *

*

     * ObjectUtil.identityToString(null)          = null
     * ObjectUtil.identityToString("")            = "java.lang.String@1e23"
     * ObjectUtil.identityToString(Boolean.TRUE)  = "java.lang.Boolean@7fa"
     * ObjectUtil.identityToString(new int[0])    = "int[]@7fa"
     * ObjectUtil.identityToString(new Object[0]) = "java.lang.Object[]@7fa"
     * 
* * @param object 对象 * @return 对象的identity,如果对象是null,则返回null */ public static String identityToString(Object object) { if (object == null) { return null; } return appendIdentityToString(new StringBuilder(), object).toString(); } /** * 取得对象自身的identity,如同对象没有覆盖toString()方法时, * Object.toString()的原始输出。 *

*

     * ObjectUtil.identityToString(null, "NULL")            = "NULL"
     * ObjectUtil.identityToString("", "NULL")              = "java.lang.String@1e23"
     * ObjectUtil.identityToString(Boolean.TRUE, "NULL")    = "java.lang.Boolean@7fa"
     * ObjectUtil.identityToString(new int[0], "NULL")      = "int[]@7fa"
     * ObjectUtil.identityToString(new Object[0], "NULL")   = "java.lang.Object[]@7fa"
     * 
* * @param object 对象 * @param nullStr 如果对象为null,则返回该字符串 * @return 对象的identity,如果对象是null,则返回指定字符串 */ public static String identityToString(Object object, String nullStr) { if (object == null) { return nullStr; } return appendIdentityToString(new StringBuilder(), object).toString(); } /** * 将对象自身的identity——如同对象没有覆盖toString()方法时, * Object.toString()的原始输出——追加到Appendable中。 *

*

     * ObjectUtil.appendIdentityToString(buf, null)          = null
     * ObjectUtil.appendIdentityToString(buf, Boolean.TRUE)  = buf.append("java.lang.Boolean@7fa")
     * ObjectUtil.appendIdentityToString(buf, new int[0])    = buf.append("int[]@7fa")
     * ObjectUtil.appendIdentityToString(buf, new Object[0]) = buf.append("java.lang.Object[]@7fa")
     * 
* * @param buffer Appendable对象 * @param object 对象 * @return Appendable对象,如果对象为null,则输出 * "null" */ public static A appendIdentityToString(A buffer, Object object) { assertNotNull(buffer, "appendable"); try { if (object == null) { buffer.append("null"); } else { buffer.append(ClassUtil.getFriendlyClassNameForObject(object)); buffer.append('@').append(Integer.toHexString(identityHashCode(object))); } } catch (IOException e) { throw new RuntimeException(e); } return buffer; } // ========================================================================== // toString方法。 // ========================================================================== /** * 取得对象的toString()的值,如果对象为null,则返回空字符串 * ""。 *

*

     * ObjectUtil.toString(null)         = ""
     * ObjectUtil.toString("")           = ""
     * ObjectUtil.toString("bat")        = "bat"
     * ObjectUtil.toString(Boolean.TRUE) = "true"
     * ObjectUtil.toString([1, 2, 3])    = "[1, 2, 3]"
     * 
* * @param object 对象 * @return 对象的toString()的返回值,或空字符串"" */ public static String toString(Object object) { return toString(object, EMPTY_STRING); } /** * 取得对象的toString()的值,如果对象为null,则返回指定字符串。 *

*

     * ObjectUtil.toString(null, null)           = null
     * ObjectUtil.toString(null, "null")         = "null"
     * ObjectUtil.toString("", "null")           = ""
     * ObjectUtil.toString("bat", "null")        = "bat"
     * ObjectUtil.toString(Boolean.TRUE, "null") = "true"
     * ObjectUtil.toString([1, 2, 3], "null")    = "[1, 2, 3]"
     * 
* * @param object 对象 * @param nullStr 如果对象为null,则返回该字符串 * @return 对象的toString()的返回值,或指定字符串 */ public static String toString(Object object, String nullStr) { if (object == null) { return nullStr; } else if (object instanceof Object[]) { return Arrays.deepToString((Object[]) object); } else if (object instanceof int[]) { return Arrays.toString((int[]) object); } else if (object instanceof long[]) { return Arrays.toString((long[]) object); } else if (object instanceof short[]) { return Arrays.toString((short[]) object); } else if (object instanceof byte[]) { return Arrays.toString((byte[]) object); } else if (object instanceof double[]) { return Arrays.toString((double[]) object); } else if (object instanceof float[]) { return Arrays.toString((float[]) object); } else if (object instanceof char[]) { return Arrays.toString((char[]) object); } else if (object instanceof boolean[]) { return Arrays.toString((boolean[]) object); } else { return object.toString(); } } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy