gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:18:24 24 4
gpt4 key购买 nike

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

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com