Android Kotlin - 如何制作java builder setter方法

问题描述 投票:1回答:1

所以我已经读过this article,但我不认为它完全是我想要的。我有一个匕首通过构造函数注入为我创建的对象。

让我们从java开始看起来像它:

    public class AlgoliaSearchUsecase extends BaseUseCase {


    private final Index algoliaIndex;
    private final SearchRepository searchRepository;

    String query;
    int pageNum;

    @Inject
    public AlgoliaSearchUsecase(Index algoliaIndex, SearchRepository searchRepository, LoginRepository loginRepository) {
        super(loginRepository);
        this.algoliaIndex = algoliaIndex;
        this.searchRepository = searchRepository;
    }

    @Override
    protected Observable<AlgoliaSearchResultsModel> buildUseCaseObservable() {
        return searchRepository.fetchAlgoliaSearchResults(query,algoliaIndex,pageNum);
    }

//***THESE TWO SETTERS ARE KEY TO MY QUESTION **********
    public AlgoliaSearchUsecase setQuery(String query) {
        this.query = query;
        return this;
    }

    public AlgoliaSearchUsecase setPageNum(int pageNum) {
        this.pageNum = pageNum;
        return this;
    }
}

注意两个setter方法返回对象本身。它可以方便地编写如下代码:

//dagger will build this for me
@Inject AlgoliaSearchUsecase searchUseCase;

// ...稍后我可以调用它的方便方法:

searchUseCase
                .setQuery(query)
                .setPageNum(pageNum).
                execute(new DefaultSubscriber(){/.../};

现在我将类AlgoliaSearchUsecase转换为Kotlin类,如下所示:

 class AlgoliaSearchUsecase @Inject
constructor(private val algoliaIndex: Index, private val searchRepository: SearchRepository, loginRepository: LoginRepository) : BaseUseCase(loginRepository) {

    internal var query: String = ""
    internal var pageNum: Int = 0

    override fun buildUseCaseObservable(): Observable<AlgoliaSearchResultsModel>? {
        return searchRepository.fetchAlgoliaSearchResults(query, algoliaIndex, pageNum)
    }

//i know i dont need these settings anymore but how can i still get the convence methods to return the object ?
    fun setQuery(query: String): AlgoliaSearchUsecase {
        this.query = query
        return this
    }

    fun setPageNum(pageNum: Int): AlgoliaSearchUsecase {
        this.pageNum = pageNum
        return this
    }
}

如果我想要方便的方法(即构建方法),我仍然需要保留这些setter方法吗?记住匕首是通过构造函数注入为我创建这个AlgoliaSearchUsecase所以当我使用它时我没有控制构造函数。

从提供的文章提到我可以做这样的事情:

val searchUseCase = AlgoliaSearchUsecase().apply{ query = "Ford"; pageNum = 2 }

但是我不能控制构造函数,匕首是。所以我不认为我能做到这一点。我怎样才能像在java中一样使用setter中的便捷方法?

android kotlin
1个回答
2
投票

使用apply实际上非常简单,它完全符合您的需要:采取一系列操作并在之后返回实例:

fun setQuery(query: String) = apply {
    this.query = query
}

fun setPageNum(pageNum: Int)  = apply {
    this.pageNum = pageNum
}

另见answer

© www.soinside.com 2019 - 2024. All rights reserved.