package com.tudicloud.framework.common.core.util.core;

import java.util.StringJoiner;

/**
 * 工具类,提供对对象进行判断、转换等通用操作的方法。
 *
 * @Author 孙达
 * @Date 2025/11/14 14:09
 * @Wechat sundaain
 * @Email 18211102099@163.com
 * @Copyright <a href="https://www.sundablog.com">孙达博客</a>
 */
public class ObjectUtils {

    // ---------------------- judge ----------------------

    /**
     * 判断两个可能为 null 的对象是否相等。
     *
     * 返回值规则如下:
     * <ul>
     *   <li>如果 a 和 b 都是 null,则返回 true。</li>
     *   <li>如果 a 和 b 都不为 null,并且通过 {@link Object#equals(Object)} 相等,则返回 true。</li>
     *   <li>其他情况均返回 false。</li>
     * </ul>
     *
     * @param a 第一个比较的对象
     * @param b 第二个比较的对象
     * @return 如果两个对象相等则返回 true,否则返回 false
     */
    public static boolean equal(Object a, Object b) {
        return a == b || (a != null && a.equals(b));
    }

    /**
     * 判断给定对象是否是一个数组类型。
     *
     * @param obj 待检测的对象(可以为 null)
     * @return 如果对象是非空并且是数组类型则返回 true,否则返回 false
     */
    public static boolean isArray(Object obj) {
        return (obj != null && obj.getClass().isArray());
    }

    /**
     * 判断给定的数组是否为空。
     *
     * @param array 要检查的数组
     * @return 如果数组为 null 或长度为 0 则返回 true,否则返回 false
     */
    public static boolean isEmpty(Object[] array) {
        return (array == null || array.length == 0);
    }

    // ---------------------- operate ----------------------

    private static final String EMPTY_STRING = "";
    private static final String NULL_STRING = "null";
    private static final String ARRAY_START = "{";
    private static final String ARRAY_END = "}";
    private static final String EMPTY_ARRAY = ARRAY_START + ARRAY_END;
    private static final String ARRAY_ELEMENT_SEPARATOR = ", ";

    /**
     * 将指定对象转为其字符串表示形式。
     *
     * 处理逻辑包括:
     * - 若对象为 null,返回 "null" 字符串;
     * - 若对象是 String 类型,直接返回该字符串;
     * - 若对象是各种基本类型的数组,调用对应的重载方法处理;
     * - 其他情况下使用其 toString() 方法并做安全校验。
     *
     * @param obj 要构建字符串的对象
     * @return 对象的字符串表示;若对象为 null 则返回 "null"
     */
    public static String toString(Object obj) {
        if (obj == null) {
            return NULL_STRING;
        }
        if (obj instanceof String) {
            return (String) obj;
        }
        if (obj instanceof Object[]) {
            return toString((Object[]) obj);
        }
        if (obj instanceof boolean[]) {
            return toString((boolean[]) obj);
        }
        if (obj instanceof byte[]) {
            return toString((byte[]) obj);
        }
        if (obj instanceof char[]) {
            return toString((char[]) obj);
        }
        if (obj instanceof double[]) {
            return toString((double[]) obj);
        }
        if (obj instanceof float[]) {
            return toString((float[]) obj);
        }
        if (obj instanceof int[]) {
            return toString((int[]) obj);
        }
        if (obj instanceof long[]) {
            return toString((long[]) obj);
        }
        if (obj instanceof short[]) {
            return toString((short[]) obj);
        }
        String str = obj.toString();
        return (str != null ? str : EMPTY_STRING);
    }

    /**
     * 将指定数组的内容转换成字符串表示形式。
     *
     * 格式示例:{元素1, 元素2, ...}。对于空数组返回 "{}"。
     *
     * @param array 要构建字符串的数组
     * @return 数组内容的字符串表示
     */
    public static String toString(Object[] array) {
        if (array == null) {
            return NULL_STRING;
        }
        int length = array.length;
        if (length == 0) {
            return EMPTY_ARRAY;
        }
        StringJoiner stringJoiner = new StringJoiner(ARRAY_ELEMENT_SEPARATOR, ARRAY_START, ARRAY_END);
        for (Object o : array) {
            stringJoiner.add(String.valueOf(o));
        }
        return stringJoiner.toString();
    }

    /**
     * 获取指定对象的身份标识字符串。
     *
     * 形如:"com.example.MyClass@abcd1234"
     *
     * @param obj 要获取身份信息的对象
     * @return 对象的身份标识字符串;若对象为 null 则返回空字符串
     */
    public static String identityToString(Object obj) {
        if (obj == null) {
            return EMPTY_STRING;
        }
        return obj.getClass().getName() + "@" + getIdentityHexString(obj);
    }

    /**
     * 获取对象的身份哈希码的十六进制字符串表示。
     *
     * @param obj 指定对象
     * @return 对象身份哈希码的十六进制字符串
     */
    public static String getIdentityHexString(Object obj) {
        return Integer.toHexString(System.identityHashCode(obj));
    }

    // ---------------------- other ----------------------
}
最后修改:2025 年 11 月 14 日
如果觉得我的文章对你有用,请随意赞赏