Design patterns 在get中使用set是一种不好的做法吗?
您好,我在android项目中使用MVVM模式,对于ViewModel,代码如下:Design patterns 在get中使用set是一种不好的做法吗?,design-patterns,android-mvvm,Design Patterns,Android Mvvm,您好,我在android项目中使用MVVM模式,对于ViewModel,代码如下: public class LoginViewModel extends ViewModel { public MutableLiveData<User> user = new MutableLiveData<>(); public MutableLiveData<String> email = new MutableLiveData<>();
public class LoginViewModel extends ViewModel {
public MutableLiveData<User> user = new MutableLiveData<>();
public MutableLiveData<String> email = new MutableLiveData<>();
public MutableLiveData<String> password = new MutableLiveData<>();
public MutableLiveData<Boolean> emailError = new MutableLiveData<>();
public MutableLiveData<Boolean> register = new MutableLiveData<>();
private LoginRespository loginRespository = new LoginRespository();
private MutableLiveData<Boolean> enable = new MutableLiveData<>();
public LoginViewModel() {
}
public void login() {
...
}
public void startRegister() {
...
}
private String getEmailValue() {
if (email.getValue() == null) {
email.setValue("");
}
return email.getValue();
}
....
}
public类LoginViewModel扩展了ViewModel{
public MutableLiveData user=new MutableLiveData();
public MutableLiveData email=new MutableLiveData();
public MutableLiveData password=new MutableLiveData();
public MutableLiveData emailError=new MutableLiveData();
public MutableLiveData register=新的MutableLiveData();
private LoginRespository LoginRespository=新建LoginRespository();
私有MutableLiveData enable=新的MutableLiveData();
公共登录视图模型(){
}
公共无效登录(){
...
}
公共无效startRegister(){
...
}
私有字符串getEmailValue(){
if(email.getValue()==null){
email.setValue(“”);
}
返回email.getValue();
}
....
}
在办公室里,我们讨论了在get中使用set是一种不好的做法,但我认为这不是一种不好的做法,因为java允许null,我不想在调用getEmailValue()时获得null值。我认为封装的概念适用于这些情况
问题是这是否真的是一种不好的做法
谢谢是的,这是不好的做法;您的getter不应该修改任何状态(自身或通过调用setter),只需检查并公开它 具体问题的解决方案是做以下两件事之一:
null
,而不修改存储的值
null
值替换为空字符串
private String setEmailValue(String email) {
email.setValue(email != null ? email : "");
}
通过这种方式,您可以确保在调用
getEmailValue()
时,始终会得到一个非空的字符串
,但您永远不会从setter中修改对象。但是,如果不针对可变实时数据的值,则此获取不是针对可变实时数据的,这是可能的,我需要在集合之前调用get,然后在这种情况下,我将得到一个空值。无论如何,第一个选项似乎很好,可以保持get不修改集合的概念value@Tlaloc-ES:如果确保底层MutableLiveData
从不包含空值很重要,那么使用选项2。另一方面,没有什么可以阻止你同时做这两件事。第三个选项,您可以与上面列出的选项中的任何一个一起使用,就是用默认值“
初始化MutableLiveData
实例,而不是null
,以确保如果您在设置它之前尝试获取该值,你仍然没有得到一个空值。如果没有选择,我可能会显示一个电子邮件选择器。
private String setEmailValue(String email) {
email.setValue(email != null ? email : "");
}