Android Kotlin – 如何使java builder setter方法

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

让我们开始在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 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? { 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中的setters?

这实际上很简单,使用apply ,这就是你所需要的:做一个动作块,然后返回实例:

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

也看到这个答案 。