所以我已经阅读了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中的便捷方法?
答案 0 :(得分:2)
使用apply
实际上非常简单,它完全符合您的需要:采取一系列操作并在之后返回实例:
fun setQuery(query: String) = apply {
this.query = query
}
fun setPageNum(pageNum: Int) = apply {
this.pageNum = pageNum
}
另见answer。