java - 如何重构一个以未知类作为参数的方法?

标签 java object methods delegates

我想让这个方法可重用,但我不确定如何提供在以下上下文中工作的参数:

  • service.getPosts() // The method called, i.e. getPosts() should vary depending on the class parameter
  • for (Post object : postResponse.getResults()) { // I want the Post class to come from the parameter
  • List<Post> objects = postResponse.getResults(); // I want the class passed into this list to also come from that same parameter
<小时/>

方法调用:

retrieveData(mCardAdapter, Post.class);

方法:

private void retrieveData(final CardAdapter mCardAdapter, final Class classParam) {
        RetrofitService service = ServiceFactory.createRetrofitService(RetrofitService.class, RetrofitService.SERVICE_ENDPOINT);
        service.getPosts()
                .subscribeOn(Schedulers.newThread())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Subscriber<PostResponse>() {
                    @Override
                    public final void onCompleted() {
                        setRefreshingFalse();
                        Log.e("RetrofitService", "Retrofit Request Completed!");
                    }

                    @Override
                    public final void onError(Throwable e) {
                        setRefreshingFalse();
                        Log.e("RetrofitService", e.getMessage());
                    }

                    @Override
                    public final void onNext(PostResponse postResponse) {
                        if (postResponse != null) {
                            Log.e("RetrofitService", "Returned objects: " + postResponse.getResults());

                            for (Post object : postResponse.getResults()) {
                                Log.e("RetrofitService", object.getObjectId() + ": " + object.getText());
                            }

                            /*for (Post post : postResponse.getResults()) {
                                mCardAdapter.addData(post);
                            }*/

                            setRefreshingFalse();

                            mCardAdapter.clear();
                            List<Post> objects = postResponse.getResults();
                            mCardAdapter.addData(objects);

                        } else {
                            Log.e("RetrofitService", "Object returned is null.");
                        }

                    }

                });
    }

当我经过Class classParam时,我刚刚得到 Unkown class: 'classParam'作为一个错误。

服务:

public interface RetrofitService {

    String SERVICE_ENDPOINT = "https://parseapi.back4app.com";

@Headers({
            "X-Parse-Application-Id: asdf",
            "X-Parse-REST-API-Key: asdf"
    })
    @GET("/classes/Post")
    Observable<PostResponse> getPosts();

}

发布对象:

public class Post implements Serializable {

    private static final String CLASS_NAME = "Post";

    private String objectId;
    private String text;

    public Post() {
    }

    public String getClassName() {
        return CLASS_NAME;
    }

    public String getObjectId() {
        return objectId;
    }

    public void setObjectId(String objectId) {
        this.objectId = objectId;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

}

更新(根据罗马的建议):

enter image description here

enter image description here

最佳答案

您没有显示PostResponse代码,但我想它是这样的:

public class PostResponse {
    private List<Post> results;

    public List<Post> getResults() {
        return results;
    }

    ....
}

那么你可以做这样的事情。

首先,参数化Response (用来代替 PostResponse ):

public class Response<T> {
    private List<T> results;

    public List<T> getResults() {
        return results;
    }

    ....
}

其次,使用类型参数更改主方法签名:

private <T> void retrieveData(final CardAdapter mCardAdapter, final Class<T> classParam, DataSaver<T> saver) {
...
}

在你的 retrieveData() 里面您使用的方法 T而不是PostResponse<T>而不是PostResponse .

但你还必须处理

mCardAdapter.addData(objects);

在这里,简单类型参数化很可能不起作用。您必须使用最后一个参数( saver )将结果放入容器中:

saver.save(results);

在你的 saver 中您实际执行的实现

public void save(List<Post> posts) {
    mCardAdapter.addData(posts);
}

DataSaver也将是通用的:

public interface DataSaver<T> {
    void save(List<T> objects);
}

关于java - 如何重构一个以未知类作为参数的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45680923/

相关文章:

javascript - 根据键值对过滤对象

java - 在 Java 上使用 String.endswith() 方法

java - Semaphore.acquire() 会因虚假唤醒而抛出 InterruptedException 吗?

vba - 迭代自定义字典对象

java - 由于作用域,对象未初始化

斯卡拉 : eta expansion of function values (not methods)

Java - 接口(interface)和方法

Java-使用扫描仪并将变量传递给其他方法

java - 为什么日期选择器会意外触发 JComboBox 的 actionPerformed?

java - 检查两个元素是否相同,每个元素来自不同的字符串数组