我有一堆管理器类来管理不同的对象,如州,国家等。 getObjects()
方法返回此类对象的列表,这些列表的值附加在不同的方法中,如下所示:
//states - StateManager.java
public String getStateMsg() {
StringBuilder msg = new StringBuilder();
if (states != null) {
for (State state : states.getObjects()) {
msg.append(state.getStateCd())).append(" ");
}
}
return msg.toString().trim();
}
//codes - CodeManager.java
public String getCodeMsg() {
StringBuilder msg = new StringBuilder();
if (codes != null) {
for (Code code : codes.getObjects()) {
msg.append(code.getCd()).append(" ");
}
}
return msg.toString().trim();
}
//countries - CountryManager.java
public String getCountriesMsg() {
StringBuilder msg = new StringBuilder();
if (countries != null) {
for (Country country : countries.getObjects()) {
msg.append(countries.get(country.getCountryCd())).append(" ");
}
}
return msg.toString().trim();
}
有明显的代码重复,我想在方法采用集合(由getObjects()
检索)并返回字符串列表时做出一般解决方案。
我发现番石榴可以从一种类型到另一种类型进行某种集合转换。但是示例中的类(State,Code,Country)不共享任何通用接口。另一方面,采用对象和方法名称的集合来检索特定对象字段的值的方法意味着使用反射并不是一个好主意。
结果我有一个问题,是否有可能避免描述代码重复并制作一个实用程序方法,它将收集对象并返回字符串集合?
答案 0 :(得分:1)
如果您没有Java 8,请使用泛型和Guava Function:
public static <T, U> String getGenericMsg(List<T> genericList, Function<T, U> function) {
StringBuilder msg = new StringBuilder();
if (genericList != null) {
for (T genericObject : genericList) {
msg.append(function.apply(genericObject)).append(" ");
}
}
return msg.toString().trim();
}
private static Function<State, String> STATE_TO_STRING = new Function<State, String>() {
public String apply(State input) {
return input.getStateCd();
}
};
private static Function<Code, String> CODE_TO_STRING = new Function<Code, String>() {
public String apply(Code input) {
return input.getCd();
}
};
private static Function<Country, String> COUNTRY_TO_STRING = new Function<Country, String>() {
public String apply(Country input) {
return input.getCountryCd();
}
};
最后是您的客户代码:
public void yourClientMethod() {
getGenericMsg(states, STATE_TO_STRING);
getGenericMsg(codes, CODE_TO_STRING);
getGenericMsg(countries, COUNTRY_TO_STRING);
}