Установка значений полей для другого экземпляра того же класса - PullRequest
1 голос
/ 23 февраля 2010
class Foo(){
   private String x,y;
   //getters setters 
}
main(){
   Foo bar1 = new Foo();
   Foo bar2 = new Foo();
   bar1.setX("hey");
   bar2.setX("hi");
   bar2.setY(" there");
   setNewValuesFromLeftToRight(bar1,bar2);//left:bar1
   System.out.print(bar2.getX+bar2.getY)// hey there
}

setNewValuesFromLeftToRight: этот метод получит любые 2 объекта с одним и тем же классом и установит значения полей bar2, используя значения полей, которые не равны NULL, для bar1
Каков наилучший способ написать метод setNewValuesFromLeftToRight? уверен, что это должно быть общее решение. Буду ли я использовать отражения?

Ответы [ 4 ]

2 голосов
/ 23 февраля 2010

То, как я читаю эти требования, заключается в том, что любое свойство в правом (целевом) компоненте должно быть перезаписано, если в левом (исходном) компоненте есть соответствующее ненулевое значение. Так что это немного отличается от PropertyUtils.copyProperties, который переписывает все свойства (включая нулевые исходные значения).

Одной из возможностей было бы использование Jakarta Commons BeanUtils , тогда вы можете использовать

PropertyDescriptor[] descriptors = PropertyUtils.getPropertyDescriptors(leftBean);
if (descriptors != null) {
  for (PropertyDescriptor descriptor : descriptors) {
    try {
      String propertyName = descriptor.getName();
      Object val = PropertyUtils.getProperty(leftBean, name);
      if (val != null) {
        PropertyUtils.setProperty(rightBean, name, val);
      }
    } catch (Exception ignore) {
      // not interested in what we can't read or write
    }
  }
}
2 голосов
/ 23 февраля 2010

Вместо того, чтобы делать это вручную, вы можете использовать Commons BeanUtils .

BeanUtils.copyProperties(bar2, bar1);
0 голосов
/ 23 февраля 2010

Если поля в Foo были общедоступными, вы можете скопировать поля напрямую, используя отражение. Тем не менее, вы не хотите обнародовать все свои поля, не так ли? ; -)

Если у вас есть принятое соглашение, такое как соглашение, используемое Java Beans, где каждому полю требуется соответствующий метод «get» и «set», тогда вы можете зациклить все методы получения первого объекта, вызвать их и передать полученные значения методам установки второго объекта. Однако это не будет работать для любых полей, которые не имеют правильных методов получения и установки.

0 голосов
/ 23 февраля 2010

Если вы хотите иметь такую ​​функцию и она должна быть универсальной, единственным способом будет использование отражения. Вы должны пройти через все переменные и проверить общедоступные сеттеры и геттеры и использовать их. Если вы хотите это для определенных классов, модифицированная версия конструктор копирования должна сделать трюк

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...