繁体   English   中英

如何使我的循环更通用?

[英]How to make my loops more generic?

下面是我的代码。 如您所见,这里有2个几乎相同的代码块。 唯一不同的是对象的类型。 我正在寻找一种使其更通用的方法。 要获得一个代码块,只需在我的方法中将类型(车主,汽车)设置为参数。 有什么提示吗? 我尝试使用反射,但由于无法遍历集合而无法使其动态化

if(queryResult.get(0) instanceof Owner) {
        classFields = Owner.class.getDeclaredFields();
        data = new Object[queryResult.size()][classFields.length];
        for(Owner owner : (List<Owner>)(Object)queryResult) {
            int rCounter = 0;
            for(Field field : owner.getClass().getDeclaredFields()) {
                field.setAccessible(true);
                try {
                    data[lCounter][rCounter] = field.get(owner);
                } catch (IllegalArgumentException e1) {
                    e1.printStackTrace();
                } catch (IllegalAccessException e1) {
                    e1.printStackTrace();
                }

                rCounter++;
            }
            lCounter++;
        }
    } else if(queryResult.get(0) instanceof Car) {
        classFields = Car.class.getDeclaredFields();
        data = new Object[queryResult.size()][classFields.length];
        for(Car car : (List<Car>)(Object)queryResult) {
            int rCounter = 0;
            for(Field field : car.getClass().getDeclaredFields()) {
                field.setAccessible(true);
                try {
                    data[lCounter][rCounter] = field.get(car);
                } catch (IllegalArgumentException e1) {
                    e1.printStackTrace();
                } catch (IllegalAccessException e1) {
                    e1.printStackTrace();
                }

                rCounter++;
            }
            lCounter++;
        }
    }

您应该可以将整个代码块折叠为:

 Class clazz = queryResult.get(0).getClass();
 classFields = clazz.getDeclaredFields();
 data = new Object[queryResult.size()][classFields.length];
 for(Object result : queryResult) {
     int rCounter = 0;
     for(Field field : clazzFields) {
         field.setAccessible(true);
          try {
              data[lCounter][rCounter] = field.get(result);
          } catch (IllegalArgumentException e1) {
               e1.printStackTrace();
          } catch (IllegalAccessException e1) {
               e1.printStackTrace();
          }
          rCounter++;
      }
      lCounter++;
}

警告:我没有编译并运行此程序进行检查

您不需要此代码重复。 只是carowner
作为Object实例。 您不使用“ Car和“ Owner ”类型
以任何不同/有意义的方式。 因此您的代码将继续正常运行
因为两种情况都以相同的方式处理。 似乎唯一
您需要更改的是:

Car.class.getDeclaredFields();
Owner.class.getDeclaredFields();

对此:

queryResult.get(0).getClass().getDeclaredFields();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM