Это плохая практика - использовать набор внутри get? - PullRequest
0 голосов
/ 12 февраля 2019

Привет, я использую шаблон MVVM в проекте Android, и для 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 isплохая практика, но я думаю, что это не плохая практика, потому что java допускает нулевые значения, и я не хочу получать нулевое значение при вызове getEmailValue (). Я думаю, что концепция инкапсуляции для этих случаев.

Вопрос в том, действительно ли это может быть плохой практикой или нет?

Спасибо

1 Ответ

0 голосов
/ 12 февраля 2019

Да, это плохая практика;ваши геттеры не должны изменять никакое состояние (сами или вызывая сеттеры), просто осмотрите и выставьте его.

Решение вашей конкретной проблемы состоит в том, чтобы сделать одну из двух вещей:

  1. Пусть ваш получатель возвратит пустую строку вместо null, без изменения сохраненного значения .

    private String getEmailValue() {
        String emailValue = email.getValue();
        return emailValue != null ? emailValue : "";
    }
    
  2. Пусть ваш установщик заменит входящий null значение с пустой строкой.

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

Таким образом, вы можете быть уверены, что при вызове getEmailValue() вы всегда получите ненулевое String, ноВы никогда не изменяете объект из своего установщика.

...