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

最近學做Android app??蠢拥臅r候被一段熟悉的代碼看懵了。

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

Class.this是啥?和this有啥區(qū)別?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有啥區(qū)別?
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的叫法是在干什么呢?
這其實是一種實現(xiàn)同步/異步(A/synchronous)的方式。這種實現(xiàn)一般是用Callback function。Callback是指把一個方程以parameter的方式發(fā)給另一個方程,在執(zhí)行過某種event之后再執(zhí)行它的某個功能。為什么搞得這么復雜,干嘛不直接該叫什么就叫什么呢?因為在Java中這種designing pattern有特定的優(yōu)勢。下面有形象的描述同步/異步的例子。這里有a/synchronous的例子。當然,Java的asynchronous需要用thread,不然就沒法把process弄出分支來。

因為Java不能把method當成parameter傳來傳去,所以得傳一個object過去,再用它的method。這種類型的設計叫Observer Pattern。這里這里有對比的兩種實現(xiàn)的例子。

這個實現(xiàn)和最開始的例子就很像了。OnClickListener就是Observerinterface。Anonymous Class就是他的一個object。當觸屏被激發(fā)的時候onClick會被調動,里面的邏輯就會被運行。

asynchronous和synchronous各有不同的用法。如果處理的先后有順序,比如排隊買票,就要用synchronous。有時候用戶點一個按鈕,后臺要loading data,這時候我們不希望讓用戶干等著,就要用到asynchronous。

Callback method:

Scenario:

有個包裹這兩天會送到你家,包裹里有你給鄰居的禮物。所以你一旦收到包裹就應該立即把禮物送給鄰居。但是你不在家,所以你留給了你老婆一張便條讓她代勞。

你可以告訴你老婆,如果收到包裹就把禮物帶給鄰居。如果你老婆像個計算機一樣傻,她會坐在門口一直等,除此之外什么都不干,直到包裹送到。她拿到包裹馬上給鄰居送去(synchroneous)。

但是更好的辦法是不用一直等,只要收到包裹,送給鄰居就行。沒收到之前該干嘛干嘛(asynchroneous)。

在這個例子中,收到包裹是一個"event",把里面的禮物帶給鄰居是"callback"。你老婆像計算機一樣run,拿到包裹馬上給鄰居送去。

·

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容