zoukankan      html  css  js  c++  java
  • 如何判断一个对象的内容是否为空

    原因

    使用Controller的形参及注解@ModelAttribute来接收页面传来的数据,但是该形参类型中的属性过多,不想一一判断,就想有没有偷懒的方法。

    搜索一番,找到一个不错的思路:利用反射获取所有字段,再判断内容是否为null。

    初步代码如下

    /**
     * 注意,如果order是null,也返回true。
     *
     * @param order
     * @return
     */
    private boolean isOrderAllFieldNull(Order order){
        if(order == null){
            return true;
        }
        Class<Order> cls = Order.class;
        Field[] fields = cls.getDeclaredFields();
        for(Field field : fields){
            try{
                field.setAccessible(true);
                if(field.get(order)!=null){
                    return false;
                }
            } catch(IllegalAccessException e){
            }
        }
        return true;
    }

    问题

    上面的代码有不少问题,例如没考虑排除serialVersionUID,甚至没考虑基本类型是有默认值的,更没考虑Order中的属性可能设有默认值。。。

    貌似离题万里了,但是因为这里需要的是判断页面有无传值进来,而不是真的判断Order对象的内容是否为空!

    就是说,前面的出发点错了!囧

     

    于是又写了代码如下(还是错的。。):

    /**
         * 目的,判断是否有赋值。
         * 不能传入null对象!!!
         * 
         * @param obj
         * @return
         * @throws Exception
         */
        public <T> boolean isAllFieldStill(T obj) throws Exception {
            Class cls = obj.getClass();
            T t2 = (T) cls.getConstructor().newInstance();// 创建一个新的对象,用于对比数据
            Field[] fields = cls.getDeclaredFields();
            for (Field field : fields) {
                field.setAccessible(true); // 访问所有字段
                // if (field.getName().equals("serialVersionUID")) {// 无视掉序列化ID
                // continue;
                // }
                if (field.get(obj) != null) { // 卧槽,基本类型做不到啊
                    if (field.getType().getName().equals("byte") || field.getType().getName().equals("short")
                            || field.getType().getName().equals("int") || field.getType().getName().equals("long")) {
                        // 判断
                        if ((int) field.get(obj) != (int) field.get(t2)) {
                            return false;
                        }
                    } else if (field.getType().getName().equals("boolean")) {
                        // 判断
                        if ((boolean) field.get(obj) != (boolean) field.get(t2)) {
                            return false;
                        }
                    } else if (field.getType().getName().equals("float")) {
                        // 判断
                        if ((float) field.get(obj) != (float) field.get(t2)) {
                            return false;
                        }
                    } else if (field.getType().getName().equals("double")) {
                        // 判断
                        if ((double) field.get(obj) != (double) field.get(t2)) {
                            return false;
                        }
                    } else {
                        // 都是引用类型了(引用类型需要有equals方法)
                        // 判断....
                        if (!field.get(obj).equals(field.get(t2))) {
                            return false;
                        }
                    }
                    return false;
                }
    
            }
    
            return true;
        }

     

    写到上面的判断的时候,突然疯了。。。

    于是有代码如下:

    /**
     * 目的,判断是否有赋值。蛋疼,直接equals就行!!!强制要求重写equals即可。
     * 不能传入null对象!!!
     * 
     * @param obj
     * @return
     * @throws Exception
     */
    public <T> boolean isAllFieldStill2(T obj) throws Exception {
        Class cls = obj.getClass();
        T t2 = (T) cls.getConstructor().newInstance();// 创建一个新的对象,用于对比数据
    
        if (t2.equals(obj)) {
            return true;
        } else {
            return false;
        }
    }

    然后想的是,我干嘛要这么麻烦,直接new个对象再equals一下不就得了。。。

     

    结论就是

    卧槽卧槽卧槽

    况且况且况且

     ----------------------------------------------------------------------------------------------

    忽略掉上面的内容

    因为刚想起来页面提交内容的时候,默认提交所有字段,哪怕没有内容!

    而springmvc的converter会将其映射成各种类型的零值(null或其他),再赋值给形参对象。

    如果形参类型的属性都是引用类型,且没有设置默认值,那么所有属性都是null。所以就是要判断所有属性是否为空。还得排除掉serialVersionUID

    另外,这个项目中,第一次请求是没有任何内容的,这个时候Controller中形参对象怎么处理?

     ----------------------------------------------------------------------------------------------

    2016-06-23

    C++Primer,看到使用构造函数设置值来区分空对象和具有实际值的对象,突然想到本文的需求。

    完全可以在spring中提供一个全null的对象和一个默认初始化的对象,从而用于对比。

    只要注入Controller即可,这样就免去了重复创建的成本。

  • 相关阅读:
    线性表17 数据结构和算法22
    线性表16:双向链表 数据结构和算法21
    栈和队列 数据结构和算法23
    栈和队列
    栈和队列
    栈和队列
    线性表16:双向链表 数据结构和算法21
    线性表17 数据结构和算法22
    桌面IE图标无法删除及IE劫持到g1476.cn的彻底恢复
    个人所得税率
  • 原文地址:https://www.cnblogs.com/larryzeal/p/5584788.html
Copyright © 2011-2022 走看看