在我的适配器中,我无法理解特定变量如何能够引用正确的变量。

我正在尝试使我的适配器能够与沙发床lite的实时查询一起使用。我的适配器如下所示:

LiveQuery query;
Context context;

public MyAdapter(Context context, LiveQuery query) {
    this.query= query;
    this.context = context;

    query.addChangeListener(new LiveQuery.ChangeListener() {
        @Override
        public void changed(LiveQuery.ChangeEvent event) {
            ((Activity) MyAdapter.this.context).runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    enumerator = event.getRows();
                    notifyDataSetChanged();
                }
            });
        }
    });

    query.start();
}


有一种方法可以在需要时停止liveQuery:

public void invalidate() {
    if (query != null) {
        query.stop();
    }
}


我正在他们的网站上跟踪this example,但是我很难理解这一点:

据我了解,这部分的查询:

// Let's call this query #1, this is the live query in this instance
this.query


与本部分中的查询不同:

// And call this query #2, this is the live query that was
// passed-in from the method argument
query.addChangeListener(...
query.start();


那么,您如何能够做到这一点:

public void invalidate() {
    if (query != null) { // This is query #1, right?
        query.stop();
    }
}


我以为您添加了更改侦听器并在构造函数中启动的liveQuery是查询2,但是invalidate()中的查询是查询1。这怎么工作?

当我们在一开始就这样做时:

this.query = query;


尚未添加任何更改侦听器,并且尚未启动实时查询,因此我认为它不起作用。我在哪里弄错了?

最佳答案

构造函数将参数引用分配给实例变量,从而使参数和对象的实例变量成为别名。对一个人所做的任何事情都可以通过另一个人访问;它们不是不同的对象,只是对同一对象的不同引用。如果您想进一步探索它,我建议您将参数名称更改为pQuery(或类似名称),并解决将导致的编译错误。那么您就不会混淆哪个“查询”是哪个。请记住,引用变量是一个两步概念,其中包含变量本身和它所引用的对象。这些与原语不同(但有些容易混淆)。

关于java - 该方法和构造函数似乎作用于两个不同的传入/存储变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40686766/

10-12 00:27
查看更多