gpt4 book ai didi

java - ViewModel中的LiveData对象为什么要在声明的时候实例化?

转载 作者:行者123 更新时间:2023-11-30 00:13:36 24 4
gpt4 key购买 nike

请考虑 Google's Architecture Components 中的以下代码教程:

class MyViewModel extends ViewModel {
private final PostalCodeRepository repository;
private final MutableLiveData<String> addressInput = new MutableLiveData();
public final LiveData<String> postalCode =
Transformations.switchMap(addressInput, (address) -> {
return repository.getPostCode(address);
});

public MyViewModel(PostalCodeRepository repository) {
this.repository = repository
}

private void setInput(String address) {
addressInput.setValue(address);
}
}

请注意,LiveData 对象是在声明期间实例化的。

据我所知 this answer ,在声明期间或在收缩器内部实例化它们之间的区别很小。然而,据我所知,当 LiveData 对象通过构造函数实例化时,可能存在 NPE 或引用过时,因此 Google 的建议是实例化它们申报期间。

我的预感 是它可能与通过反射创建 ViewModel 对象有关,但是我一直无法找到它究竟如何影响这些对象的创建.

为什么 LiveData 对象要在声明时实例化?

最佳答案

Please consider the following code from Google's Architecture Components tutorial:

那不是教程。它是一些代码 fragment 的引用,其中许多代码 fragment 不会编译,因为它们用于说明语法和调用结构,而不是实际运行。

Please note that LiveData objects are instantiated during declaration.

这就是编写该代码 fragment 的人选择要做的事情。

so Googles' recommendation is to instantiate them during declaration.

Google 没有提出此类建议。您引用的代码 fragment 只是一个示例,仅此而已。

Why should LiveData objects be instantiated during declaration?

它们没有带初始值设定项的字段。如果您愿意,欢迎您在构造函数中实例化它们。 ViewModel 有关于构造函数的特定规则(例如,如果您不提供工厂,它需要有一个零参数构造函数,或者一个单参数构造函数 Application AndroidViewModel)。但是,除此之外,您可以做任何您想做的事情。

使用初始化器通常更简洁——其中初始化器是一个可用选项——因此可能有一种趋势使用初始化器。

关于java - ViewModel中的LiveData对象为什么要在声明的时候实例化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47720524/

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