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 }
也看到这个答案 。
- 在lateinit声明后variables不更新,无法返回
- Android中的Kotlin协程:为什么要使用Anko中的bg()而不是async()?
- kotlin可见性修饰符不匹配
- Firebase @PropertyName不起作用
- 错误:链接引用失败。 – > QueuedJob
- 在Kotlin按钮上点击HTTP请求
- 类未find,androidTest中使用Android Studio 3.0.1,Room,Kotlin的空测试套件
- 房间持久性@Relation在Java中工作,但不在Kolin中
- Kotlin和Android TextWatcher具有CharSequence / String替换function