Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 在get中使用set是一种不好的做法吗?_Design Patterns_Android Mvvm - Fatal编程技术网

Design patterns 在get中使用set是一种不好的做法吗?

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<>();

您好,我在android项目中使用MVVM模式,对于ViewModel,代码如下:

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),只需检查并公开它

具体问题的解决方案是做以下两件事之一:

  • 让getter返回一个空字符串,而不是
    null
    ,而不修改存储的值

  • 让setter将传入的
    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 : "");
    }