Java中方法返回一个对象加上大括号

2023-09-19  本文已影响0人  搬码人

解释

在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();
    }
}
上一篇 下一篇

猜你喜欢

热点阅读