design-patterns - 在 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( ) 我认为封装的概念是针对这些情况的。
问题是这是否真的是一种不好的做法?
谢谢
解决方案
是的,这是不好的做法;您的 getter 不应修改任何状态(自己或通过调用 setter),只需检查并公开它。
您的具体问题的解决方案是做以下两件事之一:
让您的 getter 返回一个空字符串而不是
null
,而不修改存储的值。private String getEmailValue() { String emailValue = email.getValue(); return emailValue != null ? emailValue : ""; }
让你的 setter 用
null
空字符串替换传入的值。private String setEmailValue(String email) { email.setValue(email != null ? email : ""); }
这样,您可以确定当您调用时,getEmailValue()
您总是会得到一个 non-null String
,但您永远不会从您的 setter 中修改该对象。
推荐阅读
- angular - Can you add a flat mat-fab button to an Angular app using Angular Material?
- wpf - 当我设置边距时,WPF 边框部分未显示
- python - 这段代码的时间复杂度?(除 Self 的数组的乘积)
- c++ - multimap中的一键多值问题
- c# - 如何在集成测试之间刷新 IAppCache
- reactjs - npm install -g create-react-app 在 Windows 上给出错误 -4048 , -4051
- tensorflow - keras load_model 卡在加载状态
- clickhouse - ClickHouse 中 WHERE 子句中 UInt64 字段的条件
- javascript - 在 Wordpress Admin 中保存使用 jQuery 排序的帖子类型顺序
- python - 按类别连接 pd 数据帧的行?