我想知道你在什么情况下使用封装。此问题的目的是协作。因此,当主题被封装时,请随意分享您自己的经验。
有些情况:
计算属性
public class Order {
private List<ListItem> listItems = new ArrayList<ListItem>();
public double getTotal() {
double total = 0;
for(ListItem listItem: listItems)
total += listItem.getQuantity() * listItem.getPropduct().getPrice();
return total;
}
}
自我验证域对象
public class Person {
private String name;
public void setName(String name) {
if(StringUtils.isBlank(name)) {
throw new NotEmptyException("name", name);
}
this.name = name;
}
}
将某种特殊行为用于其他类别
public class Person {
private MutableInt id = new MutableInt();
/**
* Integer itself is immutable
*/
public Integer getId() {
retur id.intValue();
}
}
转换
public class Person {
public String enabled;
public boolean isEnabled() {
return "Y".equals(enabled);
}
}
答案 0 :(得分:4)
简单地说,我更喜欢在我设计/实现的所有非私有API中使用强封装。
习惯上不使用强封装的唯一情况是使用私有嵌套类,这些嵌套类比ersatz struct
声明更多(并且需要)。我的理由是私有类通过嵌套和私有来充分封装。
如果有令人信服的性能原因,我也准备放松封装(一点点)。当复制它们的成本过高时,这种放松通常包括泄漏内部数组/集合。这总是让我感到不舒服......
答案 1 :(得分:0)
当存在用户可以搞砸的场景时,我进行了封装。例如,如果我正在编写一个显示文本的类,我不会封装我持有字符串的事实,因为任何字符串都有效显示。
存在用于验证和界面更改的封装。如果你有一个不需要验证的参数(并且接口是明确定义的),那么封装它是没有意义的,特别是如果你使用的语言没有任何内置工具,比如Java(工具)例如,C#属性)。
封装是一种与其他工具一样的工具,不应该因为你可以在任何地方被抛出。