Java MVP-演示者比较:构造函数中注入的视图与takeView(视图v)/dropView()中的视图

Java MVP-演示者比较:构造函数中注入的视图与takeView(视图v)/dropView()中的视图,java,android,dependency-injection,mvp,android-mvp,Java,Android,Dependency Injection,Mvp,Android Mvp,我在Android中见过两种MVP模式。两者都用于: 1) 通过构造函数注入视图的演示者: public class StartVersionPresenter implements Contract.StartVersionPresenter { private final Contract.View view; private final Repository repository; public StartVersionPresenter(Contract.Vi

我在Android中见过两种MVP模式。两者都用于:

1) 通过构造函数注入视图的演示者:

public class StartVersionPresenter implements Contract.StartVersionPresenter {

    private final Contract.View view;
    private final Repository repository;

    public StartVersionPresenter(Contract.View view, Repository repository) {
        this.view = view;
        this.repository = repository;
    }

    @Override
    public void start() {
        loadData();
    }

    private void loadData() {
        repository.getData(new DataCallback() {
            @Override
            public void onDataLoaded(String someData) {
                view.showData(someData);
            }
        });
    }
}
public class DropViewVersionPresenter implements Contract.DropViewVersionPresenter {
    private final Repository repository;
    private Contract.View view;

    public DropViewVersionPresenter(Repository repository) {
        this.repository = repository;
    }


    @Override
    public void takeView(Contract.View view) {
        this.view = view;
        loadData();
    }

    @Override
    public void dropView() {
        view = null;
    }

    private void loadData() {
        repository.getData(new DataCallback() {
            @Override
            public void onDataLoaded(String someData) {
                if (view != null)
                    view.showData(someData);
            }
        });
    }
}
start()
onResume()
Fragment
的方法中调用

2) 通过方法注入视图的演示者(
takeView
,在我的示例中):

public class StartVersionPresenter implements Contract.StartVersionPresenter {

    private final Contract.View view;
    private final Repository repository;

    public StartVersionPresenter(Contract.View view, Repository repository) {
        this.view = view;
        this.repository = repository;
    }

    @Override
    public void start() {
        loadData();
    }

    private void loadData() {
        repository.getData(new DataCallback() {
            @Override
            public void onDataLoaded(String someData) {
                view.showData(someData);
            }
        });
    }
}
public class DropViewVersionPresenter implements Contract.DropViewVersionPresenter {
    private final Repository repository;
    private Contract.View view;

    public DropViewVersionPresenter(Repository repository) {
        this.repository = repository;
    }


    @Override
    public void takeView(Contract.View view) {
        this.view = view;
        loadData();
    }

    @Override
    public void dropView() {
        view = null;
    }

    private void loadData() {
        repository.getData(new DataCallback() {
            @Override
            public void onDataLoaded(String someData) {
                if (view != null)
                    view.showData(someData);
            }
        });
    }
}
takeView(Contract.View视图)
Fragment
onResume()方法中调用。
dropView()
Fragment
onDestroy()方法中调用

在这两种情况下,演示者都是在
Fragment
onCreate()方法中创建的

为什么在更多的情况下使用第二种方法而不是第一种?我可以看到第一个更简单,因为如果我们想调用视图上的方法,就不必检查视图是否为null