解释
在Java中,方法返回一个对象加上大括号的语法是匿名内部类的一种使用方式。
当一个方法返回一个对象时,通常使用该对象的类型作为返回类型。但是,在某些情况下可能可能需要创建一个临时的、具有特定行为的对象,而不是自定义一个完整的类。这时,可以使用匿名内部类来实现这个临时对象。
加上大括号的目的是定义这个匿名内部类并在其中重写重要的方法。这样的话,在方法体中就可以直接使用定义好的匿名内部类创建对象,然后返回。由于匿名内部类没有显示的类名称,因此使用大括号来包裹类的定义和实现。
实例
public Runnable getRunnable() {
return new Runnable() {
public void run() {
// 实现run方法的具体逻辑
}
};
}
在上面的例子中,通过使用匿名内部类,我们可以在方法中直接定义并返回一个具有特定行为的Runnable对象,而不需要编写额外的类。
下面这个例子是Android Jetpack中Paging源码的一部分,在build之后创建的一个Paging大管家。
细节不用管,只用知道ComputableLiveData是一个抽象类,compute()是一个抽象方法。
@AnyThread
@NonNull
@SuppressLint("RestrictedApi")
private static <Key, Value> LiveData<PagedList<Value>> create(
@Nullable final Key initialLoadKey,
@NonNull final PagedList.Config config,
@Nullable final PagedList.BoundaryCallback boundaryCallback,
@NonNull final DataSource.Factory<Key, Value> dataSourceFactory,
@NonNull final Executor notifyExecutor,
@NonNull final Executor fetchExecutor) {
return new ComputableLiveData<PagedList<Value>>(fetchExecutor) {
@Nullable
private PagedList<Value> mList;
@Nullable
private DataSource<Key, Value> mDataSource;
private final DataSource.InvalidatedCallback mCallback =
new DataSource.InvalidatedCallback() {
@Override
public void onInvalidated() {
invalidate();
}
};
@SuppressWarnings("unchecked") // for casting getLastKey to Key
@Override
protected PagedList<Value> compute() {
@Nullable Key initializeKey = initialLoadKey;
if (mList != null) {
initializeKey = (Key) mList.getLastKey();
}
do {
if (mDataSource != null) {
mDataSource.removeInvalidatedCallback(mCallback);
}
mDataSource = dataSourceFactory.create();
mDataSource.addInvalidatedCallback(mCallback);
mList = new PagedList.Builder<>(mDataSource, config)
.setNotifyExecutor(notifyExecutor)
.setFetchExecutor(fetchExecutor)
.setBoundaryCallback(boundaryCallback)
.setInitialKey(initializeKey)
.build();
} while (mList.isDetached());
return mList;
}
}.getLiveData();
}
}