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 }
也看到这个答案 。
- 当使用Kotlin :: class.java.canonicalName时OutOfMemoryexception
- 你如何建立一个Kotlin多平台构建?
- Rx和Kotlintypes推断中的generics函数引用失败
- 为什么不在Kotlin的Android 4.x下运行应用程序?
- a.run是否和kotlin中的.run一样?
- Android工作室kotlin插件错误
- Android Gradle 3.0和本地库的“Unresolved reference R”
- 在Kotlin文件的主要方法中,android studio“error:can not find or load main class”
- android.widget.Switch – 开/关事件监听器?