一阵不看就忘了- Java A/synchronous, Callback, Observer Pattern, Anonymous class

最近学做Android app。看例子的时候被一段熟悉的代码看懵了。

loginButton.setOnClickListener(new View.OnClickListener() {
  @Override
  public void onClick(View v) {
    LoginActivity.this.onLoginClicked();
  }
});

Class.this是啥?和this有啥区别?View是个interface,为啥能new?为啥用Anonymous class?以前都学过,一段时间不用全忘了。搜了一天的我把这条线总结一遍方便以后要使用的时候复习。


View是个interface,为啥能new?为啥用Anonymous class?
Java中,Anonymous class有固定的语法。每一次使用的时候就是在instantiate一个Object。interface当然不能new,但是以上语法new View.OnClickListener(){}相当于new了一个object,它所属的classimplement View这个interface的。和下面的代码的功能差不多。

View.OnClickListener v = new View.Something();
loginButton.setOnClickListener(v);
public interface View {
    public interface OnClickListener{
        void onClick(View v);
    }       
    public class Something implements TestView.View.OnClickListener{  // Something is the concrete class just for overriding the method
        @Override
        public void onClick(View v) {
            System.out.print("This is Click.");;            
        }
    }
}

很明显这段太长了,v除了用做被叫里面的onClick以外也没别的用处,用Anonymous class更方便。


Class.this是啥?和this有啥区别?
this指当前class自己。Class.this指那个class自己。一般用来refer nested class的外部class的,比如下面的例子(来自stackoverflow)。

class Person{
    String name;

    public void setName(String name){
        this.name = name;
    }

    class Displayer {
        String getPersonName() { 
            return Person.this.name; 
        }  
    }
}

Displayer里面用thisDisplayer。如果要用到PersonPerson.this。这里的this也不能省略。如果Person.this.name改成Person.name就变成叫static member了。


最开始例子中listener的叫法是在干什么呢?
这其实是一种实现同步/异步(A/synchronous)的方式。这种实现一般是用Callback function。Callback是指把一个方程以parameter的方式发给另一个方程,在执行过某种event之后再执行它的某个功能。为什么搞得这么复杂,干嘛不直接该叫什么就叫什么呢?因为在Java中这种designing pattern有特定的优势。下面有形象的描述同步/异步的例子。这里有a/synchronous的例子。当然,Java的asynchronous需要用thread,不然就没法把process弄出分支来。

因为Java不能把method当成parameter传来传去,所以得传一个object过去,再用它的method。这种类型的设计叫Observer Pattern。这里和这里有对比的两种实现的例子。

这个实现和最开始的例子就很像了。OnClickListener就是Observerinterface。Anonymous Class就是他的一个object。当触屏被激发的时候onClick会被调动,里面的逻辑就会被运行。

asynchronous和synchronous各有不同的用法。如果处理的先后有顺序,比如排队买票,就要用synchronous。有时候用户点一个按钮,后台要loading data,这时候我们不希望让用户干等着,就要用到asynchronous。

Callback method:

Scenario:

有个包裹这两天会送到你家,包裹里有你给邻居的礼物。所以你一旦收到包裹就应该立即把礼物送给邻居。但是你不在家,所以你留给了你老婆一张便条让她代劳。

你可以告诉你老婆,如果收到包裹就把礼物带给邻居。如果你老婆像个计算机一样傻,她会坐在门口一直等,除此之外什么都不干,直到包裹送到。她拿到包裹马上给邻居送去(synchroneous)。

但是更好的办法是不用一直等,只要收到包裹,送给邻居就行。没收到之前该干嘛干嘛(asynchroneous)。

在这个例子中,收到包裹是一个"event",把里面的礼物带给邻居是"callback"。你老婆像计算机一样run,拿到包裹马上给邻居送去。

·

你可能感兴趣的:(一阵不看就忘了- Java A/synchronous, Callback, Observer Pattern, Anonymous class)