删除从不同的jar调用相同对象的重复代码

时间:2014-10-16 13:21:39

标签: java

我在java中创建对象有问题,我有3个jar,每个都有一个名为“Person”的类,我包含了那些jars文件 进入我的项目,我需要定义3个对象Person,问题如下:

public class UtilClass { 
    public static com.jar1.Person definePerson1() {
       com.jar1.Person person = new com.jar1.Person();
       person.setName(Constant.NAME);
       person.setLastName(Constant.LASTNAME);
       return person;
    }

    public static com.jar2.Person definePerson2() {
       com.jar2.Person person = new com.jar2.Person();
       person.setName(Constant.NAME);
       person.setLastName(Constant.LASTNAME);
       return person;
    }

    public static com.jar3.Person definePerson3() {
       com.jar3.Person person = new com.jar3.Person();
       person.setName(Constant.NAME);
       person.setLastName(Constant.LASTNAME);
       return person;
    }
}

正如你所看到的,这些类是“相同的”,但是包是不同的,我有这个UtilClass,因为我在另一个类中定义了一个方法:

public void create() {
   com.jar1.Group = new Group(UtilClass.definePerson1()); //Only accept com.jar1.Person
   com.jar2.Group = new Group(UtilClass.definePerson2()); //Only accept com.jar2.Person
   com.jar3.Group = new Group(UtilClass.definePerson3()); //Only accept com.jar3.Person
}

如何简化类UtilClass并避免重复代码?我无法更改我的jar文件。

3 个答案:

答案 0 :(得分:1)

您可以使用反射来设置值。

例如,使用BeanUtilsConstructorUtils,比java bean api更容易使用(参见answer

public static class UtilClass { 
    public static com.jar1.Person definePerson1() {
       return newPerson(com.jar1.Person.class);
    }

    public static com.jar2.Person definePerson2() {
         return newPerson(com.jar2.Person.class);
    }

    public static com.jar3.Person definePerson3() {
         return newPerson(com.jar3.Person.class);
    }

    public static <T> T newPerson(Class<T> clazz) {
        try {
            T person = ConstructorUtils.invokeConstructor(clazz, null);
            BeanUtils.setProperty(person, "name", Constant.NAME);
            BeanUtils.setProperty(person, "lastName", Constant.LASTNAME);
            return person;
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

答案 1 :(得分:1)

如果这些类没有任何共同点,即不实现可以使用的通用接口, 您可以使用标准java.beans包在没有任何第三方库的情况下解决任务:

import java.beans.Expression;
import java.beans.Statement;

public class UtilClass {
  public static <T> T definePerson(Class<T> type) {
    try {
      Object o=new Expression(type, "new", null).getValue();
      new Statement(o, "setName", new Object[]{Constant.NAME}).execute();
      new Statement(o, "setLastName", new Object[]{Constant.LASTNAME}).execute();
      return type.cast(o);
    } catch(Exception ex) { throw new IllegalStateException(ex); }
  }
}

感谢Generics,该方法声明返回您传入的Class实例的类型。然后您的用例将如下所示:

com.jar1.Group = new Group(UtilClass.definePerson(com.jar1.Person.class));
com.jar2.Group = new Group(UtilClass.definePerson(com.jar2.Person.class));
com.jar3.Group = new Group(UtilClass.definePerson(com.jar3.Person.class));

答案 2 :(得分:0)

如果三个Persos类没有带有name和lastName字段的公共超类或与setName和setLastName方法接口,则最简单的解决方案是使用反射。

然而,使用反射是不好的做法。如果稍后将Person的名称重命名为firstName,则代码将编译,并且没有任何内容会警告您,您的UtilClass已损坏。