Java,如何将其变成通用方法?

时间:2012-05-29 13:36:40

标签: java generics methods

我如何将下面的代码重构为1种通用方法?
(背景信息,它用于从与GSON库一起使用的Json字符串中获取值)

ArrayList<Map<Object, Object>> theme = new ArrayList<Map<Object, Object>>();
for (int i = 0; i < obj.getThemeList().size(); i = i + 1) {
    if(Boolean.parseBoolean(obj.getThemeList().get(i).getChecked())){
        Map<Object,Object> map = new HashMap<Object,Object>();
        map.put("id", obj.getThemeList().get(i).getId());
        map.put("name", obj.getThemeList().get(i).getName());
        theme.add(map);
    }
}

ArrayList<Map<Object, Object>> tag = new ArrayList<Map<Object, Object>>();
for (int i = 0; i < obj.getTagList().size(); i = i + 1) {
    if(Boolean.parseBoolean(obj.getTagList().get(i).getChecked())){
        Map<Object,Object> map = new HashMap<Object,Object>();
        map.put("id", obj.getTagList().get(i).getId());
        map.put("name", obj.getTagList().get(i).getName());
        tag.add(map);
    }
}

3 个答案:

答案 0 :(得分:4)

基本上,只需将其设为接受getThemeList()getTagList()的单一方法,不是吗?看起来这是他们之间的唯一区别......

答案 1 :(得分:3)

我认为你的意思是“我怎么能重构这个以重用代码”,因为泛型不像重构那样适用于此。

首先,阅读foreach syntax - 你的for循环非常难看。

你没有给予太多帮助,但试试这个:

public interface HasIdNameAndChecked {
    String getChecked();
    String getId();
    String getName();
}

public static List<Map<String, String>> extractList(List<? extends HasIdNameAndChecked> items) {
    List<Map<String, String>> list = new ArrayList<Map<String, String>>();
    for (HasIdNameAndChecked item : items) {
        if (Boolean.parseBoolean(item.getChecked())){
            Map<String, String> map = new HashMap<String, String>();
            map.put("id", item.getId());
            map.put("name", item.getName());
            list.add(map);
        }
    }
    return list;
}

然后让您的ThemeTag类实现HasIdNameAndChecked,并将其称为:

List<Map<String, String>> list1 = extractThemeList(obj.getThemeList());
List<Map<String, String>> list2 = extractThemeList(obj.getTagList());

免责声明:我在没有IDE的情况下输入了这个内容,因此可能存在一些拼写错误。

答案 2 :(得分:0)

好吧,让我们按照以下顺序进行:

  1. 确定变化的内容。 themeList和tagList。

  2. 识别常见属性和行为。 getChecked(),getId(),getName()。

  3. 对不同的内容应用泛化。为不同的内容定义一个通用接口:抽象类,接口,行为等。

  4. 将您的解决方案更新为通用解决方案。