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

时间:2018-01-03 05:35:35

标签: android kotlin

所以我已经阅读了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中的便捷方法?

1 个答案:

答案 0 :(得分:2)

使用apply实际上非常简单,它完全符合您的需要:采取一系列操作并在之后返回实例:

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

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

另见answer