繁体   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