请考虑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我可以看出,在声明期间或在缩窄器内部实例化它们之间的差异非常小。然而,根据我的理解,当NPE
对象通过构造函数实例化时,有可能有LiveData
s或具有陈旧引用,因此谷歌&#39;建议是在声明期间实例化它们。
我的预感是因为它可能与通过反射创建ViewModel
对象有关,但我无法确定它是如何影响这些对象的创建的。
为什么要在声明期间实例化LiveData
个对象?
答案 0 :(得分:1)
请考虑使用Google的架构组件教程中的以下代码:
这不是教程。它是一些代码片段的参考,其中许多代码片段无法编译,因为它们用于说明语法和调用结构,而不是实际运行。
请注意,LiveData对象在声明期间实例化。
这就是编写该代码片段的人选择做的事情。
谷歌没有提出这样的建议。您引用的代码段是示例,仅此而已。所以Googles&#39;建议是在声明期间实例化它们。
为什么要在声明期间实例化LiveData对象?
他们没有带初始化器的字段。如果您愿意,欢迎您在构造函数中实例化它们。 ViewModel
有关于构造函数的特定规则(例如,如果你不提供工厂,它需要有一个零参数构造函数,或者Application
- AndroidViewModel
- getContainer()->get('router')->generate( 'custom_error', ['key' => 'some val'], 0 );
构造函数。 。但是,除此之外,你可以做任何你想做的事。
使用初始化程序通常更简洁 - 初始化程序是可用选项 - 因此可能存在使用初始化程序的趋势。