将几种方法组合成一个通用方法

时间:2014-03-17 10:17:01

标签: java gson

如果我有' n'这样的方法有多少,我可以通过它来优化这个并使它成为一个单一的函数吗?

或者还有其他更好的方法可以让我更通用吗?

public List<Address> getAddressList(String response) {
    List<Address> AddressList = new ArrayList<Address>();
    if (response != null && response.length() > 0) {
        try {
            Gson gson = new Gson();
            Type collectionType = new TypeToken<List<Address>>(){}.getType();
            AddressList = gson.fromJson(response, collectionType);              
        } catch (IllegalStateException ex) {
        } catch (Exception ex) {
        }
    }
    return AddressList;
}

public List<Tweet> getTweetList(String response) {
    List<Tweet> tweetList = new ArrayList<Tweet>();
    if (response != null && response.length() > 0) {
        try {
            Gson gson = new Gson();
            Type collectionType = new TypeToken<List<Tweet>>(){}.getType();
            tweetList = gson.fromJson(response, collectionType);                
        } catch (IllegalStateException ex) {
        } catch (Exception ex) {
        }
    }
    return tweetList;
} 

1 个答案:

答案 0 :(得分:3)

this here question复制axtavt的回答:


如果没有将T(作为Class<T>)的实际类型传递给您的方法,则无法执行此操作。

但如果您明确传递,则可以为TypeToken创建List<T>,如下所示:

private <T> List<T> GetListFromFile(String filename, Class<T> elementType) {
    ...
    TypeToken<List<T>> token = new TypeToken<List<T>>() {}
        .where(new TypeParameter<T>() {}, elementType);
    List<T> something = gson.fromJson(data, token);
    ...
}

另见:


所以,要回答你的问题,你可以这样做:

public List<Address> getAddressList(final String response) {
    return getGenericList(response, Address.class);
}

public List<Tweet> getTweetList(final String response) {
    return getGenericList(response, Tweet.class);
}

@SuppressWarnings("serial")
private <T> List<T> getGenericList(final String response, final Class<T> elementType) {
    List<T> list = new ArrayList<T>();
    if (response != null && response.length() > 0) {
        try {
            final Gson gson = new Gson();
            final Type collectionType = 
                    new TypeToken<List<T>>(){}.where(new TypeParameter<T>() {}, elementType).getType();
            list = gson.fromJson(response, collectionType);
        }
        catch (final IllegalStateException ex) {
        }
        catch (final Exception ex) {
        }
    }
    return list;
}

编辑:尝试了代码

我尝试使用以下小测试来编写此代码,该测试应该只创建一些地址列表:

public static void main(final String[] args) {
    final List<Address> addressList = getAddressList("[{}, {}]");
    System.out.println(addressList);
}

输出结果为:

  

[gson.Address@6037fb1e,gson.Address @ 7b479feb]

我在我的测试项目中创建了自己的Address类,因此上面输出中的gson.Address。