Java代码的这种结构是什么?

时间:2018-06-28 06:56:35

标签: java android

有人可以向我解释此代码是哪种类型的结构?我正在使用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) {
    }
}

如您所见,这不是抽象类,也不是要重写的接口。没有覆盖关键字。那是什么?

2 个答案:

答案 0 :(得分:1)

匿名类中缺少替代。

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

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

现在,该类用于异步使用:稍后将调用这两个方法,并在这两个事件上调用提供程序。

但是,如果提供者对可用性或结果不感兴趣,则不必覆盖不需要的回调方法。

如果只有一个回调,则通常使用接口而不是类。

答案 1 :(得分:1)

这是一个匿名课程。当您只想重写某些方法时,可以使用匿名类来扩展不是抽象的类。它不仅限于接口和抽象类。

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并仅覆盖他们要覆盖的方法。使事情变得简单。

在您的情况下,他们完全跳过了定义接口的操作,只定义了零实现的基类。也可以。