簡體   English   中英

Java代碼的這種結構是什么?

[英]What is this structure of code in Java?

誰能向我解釋此代碼是哪種類型的結構? 我正在使用Google定位,當我遇到以下代碼時,這對我很有趣:

private LocationCallback locationCallback;
public final void readyToUpdateLocation() {
        locationCallback = new LocationCallback() {
            public void onLocationAvailability(LocationAvailability p0) {
                //do sth here...    
            }

            public void onLocationResult(LocationResult locationResult) {
                //do sth here....
            }
        };
    }

public final void startLocationUpdates() {
        try {
            FusedLocationProviderClient providerClient = this.fusedLocationClient;
            providerClient.requestLocationUpdates(this.locationRequest, this.locationCallback, null);
        } catch (Exception var2) {
            Handle(car2);
        }
    }

//What exactly LocationCallback class is!    


public class LocationCallback {
    public LocationCallback() {
    }

    public void onLocationResult(LocationResult var1) {
    }

    public void onLocationAvailability(LocationAvailability var1) {
    }
}

如您所見,這不是抽象類,也不是要重寫的接口。 沒有覆蓋關鍵字。 那是什么

匿名類中缺少替代。

locationCallback = new LocationCallback() {
        @Override
        public void onLocationAvailability(LocationAvailability p0) {
            //do sth here...    
        }

        @Override
        public void onLocationResult(LocationResult locationResult) {
            //do sth here....
        }
    };

現在,該類用於異步使用:稍后調用這兩個方法,並在這兩個事件上調用提供程序。

但是,如果提供者對可用性或結果不感興趣,則不需要覆蓋不需要的回調方法。

如果只有一個回調,則通常使用接口而不是類。

這是一個匿名類。 當您只想重寫某些方法時,可以使用匿名類來擴展不是抽象的類。 它不僅限於接口和抽象類。

LocationCallback是遵循“基本實現”的通常邏輯的類。 通常,原理是定義一個接口:

interface LocationCallback {
  void onLocationResult(LocationResult var1);
  void onLocationAvailability(LocationAvailability var1);
}

但是,由於此接口定義了兩種方法,您可能只想對提供的兩個事件之一作出反應,因此要求所有用戶每次想對一種方法做出反應時,都要求所有用戶為這兩種方法提供實現的工作量太大了。

為了減少工作量,通常提供一個基類,該基類實現接口的所有方法,並使它們不執行任何操作:

public class BaseLocationCallBack implements LocationCallBack {
    @Override
    public void onLocationResult(LocationResult var1) {
    }

    @Override
    public void onLocationAvailability(LocationAvailability var1) {
    }
}

這樣,回調的用戶可以簡單地擴展BaseLocationCallBack並僅覆蓋他們要覆蓋的方法。 使事情變得簡單。

在您的情況下,他們完全跳過了定義接口的操作,只定義了零實現的基類。 那也行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM