Java 从对象列表中获取每个对象中的属性列表时防止代码重复

标签 java generics code-duplication

我有几个看起来像这样的对象:

class PhoneNumber
{
   String   getNumber();
   String   getExtension();
   DateTime getLastCalled();
}
class Address
{
   String getCity();
   string getState();
   int    getZip();
}

我希望能够获取其中任何一个对象的列表并获得特定属性的列表。如果我要为每个属性编写一个函数,这是一个微不足道的操作,但据我所知,多次重复代码是不好的做法。

所以我希望能够对任一对象中的任何属性执行这样的操作:

List<Address> AddressList = getAddresses();
List<String> CityList = getListOfProperties( AddressList, Address.getCity /*<--Instruction as to what property to populate the returned list with */ )

我绞尽脑汁想用泛型来做到这一点。我什至不确定这是否可能,但据我了解,Java 编程语言可以完成许多神奇的事情。

最佳答案

您可以使用泛型和实用程序类来完成这项工作。我喜欢这比使用反射好一点,因为你可以在编译时检查你正在检索的属性是否存在(并且没有拼写错误等)。

首先是一个进行实际转换的类。请注意抽象的“get”方法,我们将在调用 getListOfProperties() 时在匿名内部类中覆盖它。

public abstract class ListPropertyGetter<R,T>
{
  /** Given a source object, returns some property of type R. */ 
  public abstract R get(T source);

  /** Given a list of objects, use the "get" method to retrieve a single property
      from every list item and return a List of those property values. */
  public final List<R> getListOfProperties(List<T> list)
  {
    List<R> ret = new ArrayList<R>(list.size());
    for(T source : list)
    {
      ret.add(get(source));
    }
    return ret;
  }
}

然后你就这样使用它。不是一个漂亮的类轮,但编译时检查善良:

List<PhoneNumber> phoneNumbers = new ArrayList<PhoneNumber>();
// add some PhoneNumbers to the list
List<String> extensions =
  new ListPropertyGetter<String, PhoneNumber>()
  {
    @Override
    public String get(PhoneNumber source)
    {
      return source.getExtension();
    }
  }.getListOfProperties(phoneNumbers);

关于Java 从对象列表中获取每个对象中的属性列表时防止代码重复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2195074/

相关文章:

java - GWT。以编程方式触发 ListBox 上的 ChangeEvent。

java - Spring Security Configuration @Order 不是唯一异常

java - 如何在 Log4j2 中将 appender 添加到 Logger

java - 为什么这些泛型不能在 OpenJDK7 中编译,但可以在 OpenJDK6 中编译

c++ - 迭代 vector <int> 或数值范围时如何避免代码重复?

java - 使用动态表达式查找具体类(其中将类实例传递给 DAO)

java - 通用列表中的编译错误

swift - 如何使泛型类的计算属性依赖于类约束

javascript - 消除重复代码 : lambda loop parameter passing

javascript - JS – 三元运算符,以避免条件中的过度链接。是否可以?