gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 00:03:15 26 4
gpt4 key购买 nike

所以我已经阅读了this article但我不认为这完全是我想要的。我有一个 dagger 通过构造函数注入(inject)为我创建的对象。

让我们从 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
}
}

如果我想要方便的方法(即构建器方法),我还必须保留这些设置方法吗?请记住,dagger 通过构造函数注入(inject)为我创建了这个 AlgoliaSearchUsecase,所以我在使用它时无法控制构造函数。

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

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

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

最佳答案

这实际上通过使用 apply 非常容易,它完全满足您的需要:执行一个操作 block 并在之后返回实例:

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

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

另见 answer .

关于Android Kotlin - 如何制作 java builder setter 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48071724/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com