当前位置: 首页 > 知识库问答 >
问题:

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

郎泰平
2023-03-14

所以我已经读了这篇文章,但我不认为它完全是我想要的。我有一个dagger通过构造函数注入为我创建的对象。

让我们从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方法吗?记住dagger是通过构造函数注入来为我创建这个< code > AlgoliaSearchUsecase 的,所以我在使用它的时候不能控制构造函数。

从文章中可以看出,我可以这样做:

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

但是我不能控制构造函数,匕首是。所以我不认为我能做到这一点。我怎么还能像在java中一样使用setter中的方便方法呢?

共有1个答案

澹台宾白
2023-03-14

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

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

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

另请参阅此答案。

 类似资料:
  • 问题内容: 使用in声明完成了Objective-C中的类(或静态)方法。 如何在Swift中实现? 问题答案: 它们被称为 类型属性 和 类型方法 ,您可以使用或关键字。

  • 我有一个: 我需要这样做: 但我确实这样做了,我收到了一条消息:无法调用forEach((e)- 我做错了什么?如何为每个人做到这一点?

  • 问题内容: 我编写了一个程序来搜索.txt文件。 如果单击文件,则意味着应该出现“打开方式”对话框,并且该对话框将包含所有已安装程序的列表。 我正在使用以下代码搜索文件: 我可以使用什么Java代码显示“打开方式”对话框? 问题答案: 您应该为此使用 。在这里看看:

  • 我有一个接受作为参数的方法。当用户请求 page = 0 和 size = 20 等时,我想将这些传递的值作为。 我做的是 它给出了轴测: EL1008E:在类型为“org.springframework.data.domain.PageRequest”的对象上找不到属性或字段“number” - 也许不是公共的? 我怎样才能使缓存成为它的关键?

  • 祝大家过得愉快,我想问一件事,我需要用方括号而不是卷发来制作JSON数组,但现在我有了这样的JSON: 我想把它改成这样: 所以我可以把JSON放在我的数据表中,因为它需要方括号而不是方括号,不管怎样,我也在使用reactjs,有可能把JSON数组变成这样吗? 这是我的密码 如果有人能帮助我,我真的很感激:)