首页 > 解决方案 > 在 get 中使用 set 是一种不好的做法吗?

问题描述

您好我在一个 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();
    }
....
}

在办公室,我们讨论过在 get 中使用 set 是一种不好的做法,但我认为这不是一种不好的做法,因为 java 允许空值,并且我不想在调用 getEmailValue( ) 我认为封装的概念是针对这些情况的。

问题是这是否真的是一种不好的做法?

谢谢

标签: design-patternsandroid-mvvm

解决方案


是的,这是不好的做法;您的 getter 不应修改任何状态(自己或通过调用 setter),只需检查并公开它。

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

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

    private String getEmailValue() {
        String emailValue = email.getValue();
        return emailValue != null ? emailValue : "";
    }
    
  2. 让你的 setter 用null空字符串替换传入的值。

    private String setEmailValue(String email) {
        email.setValue(email != null ? email : "");
    }
    

这样,您可以确定当您调用时,getEmailValue()您总是会得到一个 non-null String,但您永远不会从您的 setter 中修改该对象。


推荐阅读