Android Kotlin – Как настроить методы настройки Java-конструктора

Поэтому я уже прочитал эту статью, но я не думаю, что ее полностью то, что я хочу. У меня есть объект, который создает кинжал для меня через инъекцию конструктора.

Давайте начнем с 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 } } 

мне все еще нужно сохранять эти методы настройки, если я хочу использовать методы удобства (т. е. методы построения)? Помните, что кинжал создает эту AlgoliaSearchUsecase для меня путем инъекции конструктора, поэтому я не могу управлять конструктором, когда я его использую.

Из этой статьи было сказано, что я могу сделать что-то вроде этого:

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

но я не контролирую конструктор, кинжал есть. поэтому я не думаю, что смогу это сделать. Как я могу использовать методы удобства в сеттерах, как это было в java?

Это на самом деле довольно легко с использованием apply , который делает именно то, что вам нужно: возьмите блок действий и верните экземпляр потом:

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

Также см. Этот ответ .